@arikajs/database 0.0.1
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/LICENSE +21 -0
- package/README.md +333 -0
- package/dist/Connections/MySQLConnection.d.ts +39 -0
- package/dist/Connections/MySQLConnection.d.ts.map +1 -0
- package/dist/Connections/MySQLConnection.js +91 -0
- package/dist/Connections/MySQLConnection.js.map +1 -0
- package/dist/Connections/PostgreSQLConnection.d.ts +39 -0
- package/dist/Connections/PostgreSQLConnection.d.ts.map +1 -0
- package/dist/Connections/PostgreSQLConnection.js +85 -0
- package/dist/Connections/PostgreSQLConnection.js.map +1 -0
- package/dist/Connections/SQLiteConnection.d.ts +51 -0
- package/dist/Connections/SQLiteConnection.d.ts.map +1 -0
- package/dist/Connections/SQLiteConnection.js +111 -0
- package/dist/Connections/SQLiteConnection.js.map +1 -0
- package/dist/Contracts/Database.d.ts +131 -0
- package/dist/Contracts/Database.d.ts.map +1 -0
- package/dist/Contracts/Database.js +3 -0
- package/dist/Contracts/Database.js.map +1 -0
- package/dist/Contracts/Schema.d.ts +124 -0
- package/dist/Contracts/Schema.d.ts.map +1 -0
- package/dist/Contracts/Schema.js +3 -0
- package/dist/Contracts/Schema.js.map +1 -0
- package/dist/Database.d.ts +38 -0
- package/dist/Database.d.ts.map +1 -0
- package/dist/Database.js +55 -0
- package/dist/Database.js.map +1 -0
- package/dist/DatabaseManager.d.ts +36 -0
- package/dist/DatabaseManager.d.ts.map +1 -0
- package/dist/DatabaseManager.js +126 -0
- package/dist/DatabaseManager.js.map +1 -0
- package/dist/Migrations/Migration.d.ts +17 -0
- package/dist/Migrations/Migration.d.ts.map +1 -0
- package/dist/Migrations/Migration.js +10 -0
- package/dist/Migrations/Migration.js.map +1 -0
- package/dist/Migrations/Migrator.d.ts +51 -0
- package/dist/Migrations/Migrator.d.ts.map +1 -0
- package/dist/Migrations/Migrator.js +166 -0
- package/dist/Migrations/Migrator.js.map +1 -0
- package/dist/Model/Model.d.ts +309 -0
- package/dist/Model/Model.d.ts.map +1 -0
- package/dist/Model/Model.js +607 -0
- package/dist/Model/Model.js.map +1 -0
- package/dist/Model/Relations.d.ts +53 -0
- package/dist/Model/Relations.d.ts.map +1 -0
- package/dist/Model/Relations.js +124 -0
- package/dist/Model/Relations.js.map +1 -0
- package/dist/Model/SoftDeletes.d.ts +24 -0
- package/dist/Model/SoftDeletes.d.ts.map +1 -0
- package/dist/Model/SoftDeletes.js +95 -0
- package/dist/Model/SoftDeletes.js.map +1 -0
- package/dist/Query/QueryBuilder.d.ts +94 -0
- package/dist/Query/QueryBuilder.d.ts.map +1 -0
- package/dist/Query/QueryBuilder.js +276 -0
- package/dist/Query/QueryBuilder.js.map +1 -0
- package/dist/Schema/Grammars/Grammar.d.ts +27 -0
- package/dist/Schema/Grammars/Grammar.d.ts.map +1 -0
- package/dist/Schema/Grammars/Grammar.js +25 -0
- package/dist/Schema/Grammars/Grammar.js.map +1 -0
- package/dist/Schema/Grammars/MySQLGrammar.d.ts +13 -0
- package/dist/Schema/Grammars/MySQLGrammar.d.ts.map +1 -0
- package/dist/Schema/Grammars/MySQLGrammar.js +78 -0
- package/dist/Schema/Grammars/MySQLGrammar.js.map +1 -0
- package/dist/Schema/Grammars/PostgreSQLGrammar.d.ts +13 -0
- package/dist/Schema/Grammars/PostgreSQLGrammar.d.ts.map +1 -0
- package/dist/Schema/Grammars/PostgreSQLGrammar.js +57 -0
- package/dist/Schema/Grammars/PostgreSQLGrammar.js.map +1 -0
- package/dist/Schema/Grammars/SQLiteGrammar.d.ts +13 -0
- package/dist/Schema/Grammars/SQLiteGrammar.d.ts.map +1 -0
- package/dist/Schema/Grammars/SQLiteGrammar.js +53 -0
- package/dist/Schema/Grammars/SQLiteGrammar.js.map +1 -0
- package/dist/Schema/Schema.d.ts +120 -0
- package/dist/Schema/Schema.d.ts.map +1 -0
- package/dist/Schema/Schema.js +226 -0
- package/dist/Schema/Schema.js.map +1 -0
- package/dist/Schema/SchemaBuilder.d.ts +24 -0
- package/dist/Schema/SchemaBuilder.d.ts.map +1 -0
- package/dist/Schema/SchemaBuilder.js +49 -0
- package/dist/Schema/SchemaBuilder.js.map +1 -0
- package/dist/Seeders/SeedRunner.d.ts +22 -0
- package/dist/Seeders/SeedRunner.d.ts.map +1 -0
- package/dist/Seeders/SeedRunner.js +72 -0
- package/dist/Seeders/SeedRunner.js.map +1 -0
- package/dist/Seeders/Seeder.d.ts +11 -0
- package/dist/Seeders/Seeder.d.ts.map +1 -0
- package/dist/Seeders/Seeder.js +10 -0
- package/dist/Seeders/Seeder.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BelongsToMany = exports.BelongsTo = exports.HasMany = exports.HasOne = exports.Relation = void 0;
|
|
4
|
+
const Database_1 = require("../Database");
|
|
5
|
+
/**
|
|
6
|
+
* Base class for all relationship types
|
|
7
|
+
*/
|
|
8
|
+
class Relation {
|
|
9
|
+
constructor(related, parent) {
|
|
10
|
+
this.related = related;
|
|
11
|
+
this.parent = parent;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.Relation = Relation;
|
|
15
|
+
/**
|
|
16
|
+
* Has One relationship
|
|
17
|
+
*/
|
|
18
|
+
class HasOne extends Relation {
|
|
19
|
+
constructor(related, parent, foreignKey, localKey = 'id') {
|
|
20
|
+
super(related, parent);
|
|
21
|
+
this.foreignKey = foreignKey;
|
|
22
|
+
this.localKey = localKey;
|
|
23
|
+
}
|
|
24
|
+
async get() {
|
|
25
|
+
const parentKeyValue = this.parent[this.localKey];
|
|
26
|
+
if (!parentKeyValue) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return await this.related
|
|
30
|
+
.where(this.foreignKey, parentKeyValue)
|
|
31
|
+
.first();
|
|
32
|
+
}
|
|
33
|
+
query() {
|
|
34
|
+
const parentKeyValue = this.parent[this.localKey];
|
|
35
|
+
return this.related.query().where(this.foreignKey, parentKeyValue);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.HasOne = HasOne;
|
|
39
|
+
/**
|
|
40
|
+
* Has Many relationship
|
|
41
|
+
*/
|
|
42
|
+
class HasMany extends Relation {
|
|
43
|
+
constructor(related, parent, foreignKey, localKey = 'id') {
|
|
44
|
+
super(related, parent);
|
|
45
|
+
this.foreignKey = foreignKey;
|
|
46
|
+
this.localKey = localKey;
|
|
47
|
+
}
|
|
48
|
+
async get() {
|
|
49
|
+
const parentKeyValue = this.parent[this.localKey];
|
|
50
|
+
if (!parentKeyValue) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
return await this.related
|
|
54
|
+
.where(this.foreignKey, parentKeyValue)
|
|
55
|
+
.get();
|
|
56
|
+
}
|
|
57
|
+
query() {
|
|
58
|
+
const parentKeyValue = this.parent[this.localKey];
|
|
59
|
+
return this.related.query().where(this.foreignKey, parentKeyValue);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.HasMany = HasMany;
|
|
63
|
+
/**
|
|
64
|
+
* Belongs To relationship
|
|
65
|
+
*/
|
|
66
|
+
class BelongsTo extends Relation {
|
|
67
|
+
constructor(related, parent, foreignKey, ownerKey = 'id') {
|
|
68
|
+
super(related, parent);
|
|
69
|
+
this.foreignKey = foreignKey;
|
|
70
|
+
this.ownerKey = ownerKey;
|
|
71
|
+
}
|
|
72
|
+
async get() {
|
|
73
|
+
const foreignKeyValue = this.parent[this.foreignKey];
|
|
74
|
+
if (!foreignKeyValue) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return await this.related
|
|
78
|
+
.where(this.ownerKey, foreignKeyValue)
|
|
79
|
+
.first();
|
|
80
|
+
}
|
|
81
|
+
query() {
|
|
82
|
+
const foreignKeyValue = this.parent[this.foreignKey];
|
|
83
|
+
return this.related.query().where(this.ownerKey, foreignKeyValue);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.BelongsTo = BelongsTo;
|
|
87
|
+
/**
|
|
88
|
+
* Belongs To Many relationship (many-to-many)
|
|
89
|
+
*/
|
|
90
|
+
class BelongsToMany extends Relation {
|
|
91
|
+
constructor(related, parent, pivotTable, foreignPivotKey, relatedPivotKey, parentKey = 'id', relatedKey = 'id') {
|
|
92
|
+
super(related, parent);
|
|
93
|
+
this.pivotTable = pivotTable;
|
|
94
|
+
this.foreignPivotKey = foreignPivotKey;
|
|
95
|
+
this.relatedPivotKey = relatedPivotKey;
|
|
96
|
+
this.parentKey = parentKey;
|
|
97
|
+
this.relatedKey = relatedKey;
|
|
98
|
+
}
|
|
99
|
+
async get() {
|
|
100
|
+
const parentKeyValue = this.parent[this.parentKey];
|
|
101
|
+
if (!parentKeyValue) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
const relatedTable = this.related.table;
|
|
105
|
+
const connection = await Database_1.Database.connection(this.related.connection);
|
|
106
|
+
// Build the query with a join
|
|
107
|
+
const sql = `
|
|
108
|
+
SELECT ${relatedTable}.*
|
|
109
|
+
FROM ${relatedTable}
|
|
110
|
+
INNER JOIN ${this.pivotTable}
|
|
111
|
+
ON ${relatedTable}.${this.relatedKey} = ${this.pivotTable}.${this.relatedPivotKey}
|
|
112
|
+
WHERE ${this.pivotTable}.${this.foreignPivotKey} = ?
|
|
113
|
+
`;
|
|
114
|
+
const results = await connection.query(sql, [parentKeyValue]);
|
|
115
|
+
// Hydrate the results into model instances
|
|
116
|
+
return results.map((data) => {
|
|
117
|
+
const instance = new this.related();
|
|
118
|
+
Object.assign(instance, data);
|
|
119
|
+
return instance;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.BelongsToMany = BelongsToMany;
|
|
124
|
+
//# sourceMappingURL=Relations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Relations.js","sourceRoot":"","sources":["../../src/Model/Relations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Model } from './Model';
|
|
2
|
+
/**
|
|
3
|
+
* Soft Delete interface
|
|
4
|
+
*/
|
|
5
|
+
export interface SoftDeletes {
|
|
6
|
+
deleted_at: Date | null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Mixin to add soft delete functionality to models
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* class User extends withSoftDeletes(Model) {
|
|
14
|
+
* static table = 'users';
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* await User.delete(1); // Soft deletes
|
|
18
|
+
* await User.withTrashed().get(); // Include soft deleted
|
|
19
|
+
* await User.restore(1); // Restore soft deleted
|
|
20
|
+
* await User.forceDelete(1); // Permanently delete
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function withSoftDeletes<TBase extends typeof Model>(Base: TBase): TBase;
|
|
24
|
+
//# sourceMappingURL=SoftDeletes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SoftDeletes.d.ts","sourceRoot":"","sources":["../../src/Model/SoftDeletes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,SAAS,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,KAAK,SAAS,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,GAsFlC,KAAK,CACzC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withSoftDeletes = withSoftDeletes;
|
|
4
|
+
/**
|
|
5
|
+
* Mixin to add soft delete functionality to models
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* class User extends withSoftDeletes(Model) {
|
|
10
|
+
* static table = 'users';
|
|
11
|
+
* }
|
|
12
|
+
*
|
|
13
|
+
* await User.delete(1); // Soft deletes
|
|
14
|
+
* await User.withTrashed().get(); // Include soft deleted
|
|
15
|
+
* await User.restore(1); // Restore soft deleted
|
|
16
|
+
* await User.forceDelete(1); // Permanently delete
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
function withSoftDeletes(Base) {
|
|
20
|
+
class SoftDeleteModel extends Base {
|
|
21
|
+
constructor(...args) {
|
|
22
|
+
super(...args);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Override delete to use soft deletes
|
|
26
|
+
*/
|
|
27
|
+
static async delete(id) {
|
|
28
|
+
if (this.useSoftDeletes) {
|
|
29
|
+
const primaryKey = this.getPrimaryKeyName();
|
|
30
|
+
return await this.query()
|
|
31
|
+
.where(primaryKey, id)
|
|
32
|
+
.update({ [this.deletedAtColumn]: new Date() });
|
|
33
|
+
}
|
|
34
|
+
// Call the parent delete method
|
|
35
|
+
return await this.query().delete(id);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Include trashed (soft deleted) records in query
|
|
39
|
+
*/
|
|
40
|
+
static withTrashed() {
|
|
41
|
+
// Create a fresh query without soft delete filtering
|
|
42
|
+
const connection = this.getConnectionName();
|
|
43
|
+
const table = this.getTableName();
|
|
44
|
+
const { Database } = require('../Database');
|
|
45
|
+
const queryBuilder = Database.table(table, connection);
|
|
46
|
+
const { ModelQueryBuilder } = require('./Model');
|
|
47
|
+
return new ModelQueryBuilder(queryBuilder, this);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Only get trashed (soft deleted) records
|
|
51
|
+
*/
|
|
52
|
+
static onlyTrashed() {
|
|
53
|
+
return this.withTrashed().whereNotNull(this.deletedAtColumn);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Restore a soft deleted record
|
|
57
|
+
*/
|
|
58
|
+
static async restore(id) {
|
|
59
|
+
const primaryKey = this.getPrimaryKeyName();
|
|
60
|
+
return await this.withTrashed()
|
|
61
|
+
.where(primaryKey, id)
|
|
62
|
+
.update({ [this.deletedAtColumn]: null });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Force delete a record (permanently delete)
|
|
66
|
+
*/
|
|
67
|
+
static async forceDelete(id) {
|
|
68
|
+
const primaryKey = this.getPrimaryKeyName();
|
|
69
|
+
return await this.withTrashed()
|
|
70
|
+
.where(primaryKey, id)
|
|
71
|
+
.delete();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Override query to automatically exclude soft deleted records
|
|
75
|
+
*/
|
|
76
|
+
static query() {
|
|
77
|
+
const baseQuery = super.query();
|
|
78
|
+
const queryBuilder = baseQuery;
|
|
79
|
+
if (this.useSoftDeletes) {
|
|
80
|
+
queryBuilder.whereNull(this.deletedAtColumn);
|
|
81
|
+
}
|
|
82
|
+
return queryBuilder;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The name of the "deleted at" column
|
|
87
|
+
*/
|
|
88
|
+
SoftDeleteModel.deletedAtColumn = 'deleted_at';
|
|
89
|
+
/**
|
|
90
|
+
* Indicates if the model should use soft deletes
|
|
91
|
+
*/
|
|
92
|
+
SoftDeleteModel.useSoftDeletes = true;
|
|
93
|
+
return SoftDeleteModel;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=SoftDeletes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SoftDeletes.js","sourceRoot":"","sources":["../../src/Model/SoftDeletes.ts"],"names":[],"mappings":";;AAwBA,0CAuFC;AAtGD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,eAAe,CAA6B,IAAW;IACnE,MAAM,eAAgB,SAAS,IAAY;QAWvC,YAAY,GAAG,IAAW;YACtB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACnB,CAAC;QAED;;WAEG;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAO;YACvB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,MAAM,UAAU,GAAI,IAAY,CAAC,iBAAiB,EAAE,CAAC;gBACrD,OAAO,MAAO,IAAY,CAAC,KAAK,EAAE;qBAC7B,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;qBACrB,MAAM,CAAC,EAAE,CAAE,IAAY,CAAC,eAAe,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,gCAAgC;YAChC,OAAO,MAAO,IAAY,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QAED;;WAEG;QACH,MAAM,CAAC,WAAW;YACd,qDAAqD;YACrD,MAAM,UAAU,GAAI,IAAY,CAAC,iBAAiB,EAAE,CAAC;YACrD,MAAM,KAAK,GAAI,IAAY,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACvD,MAAM,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YACjD,OAAO,IAAI,iBAAiB,CAAC,YAAY,EAAE,IAAW,CAAC,CAAC;QAC5D,CAAC;QAED;;WAEG;QACH,MAAM,CAAC,WAAW;YACd,OAAO,IAAI,CAAC,WAAW,EAAK,CAAC,YAAY,CAAE,IAAY,CAAC,eAAe,CAAC,CAAC;QAC7E,CAAC;QAED;;WAEG;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAO;YACxB,MAAM,UAAU,GAAI,IAAY,CAAC,iBAAiB,EAAE,CAAC;YACrD,OAAO,MAAM,IAAI,CAAC,WAAW,EAAE;iBAC1B,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;iBACrB,MAAM,CAAC,EAAE,CAAE,IAAY,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED;;WAEG;QACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAO;YAC5B,MAAM,UAAU,GAAI,IAAY,CAAC,iBAAiB,EAAE,CAAC;YACrD,OAAO,MAAM,IAAI,CAAC,WAAW,EAAE;iBAC1B,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;iBACrB,MAAM,EAAE,CAAC;QAClB,CAAC;QAED;;WAEG;QACH,MAAM,CAAC,KAAK;YACR,MAAM,SAAS,GAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,SAAiC,CAAC;YAEvD,IAAK,IAAY,CAAC,cAAc,EAAE,CAAC;gBAC/B,YAAY,CAAC,SAAS,CAAE,IAAY,CAAC,eAAe,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,YAAY,CAAC;QACxB,CAAC;;IAjFD;;OAEG;IACI,+BAAe,GAAW,YAAY,CAAC;IAE9C;;OAEG;IACI,8BAAc,GAAY,IAAI,CAAC;IA4E1C,OAAO,eAA+B,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Connection } from '../Contracts/Database';
|
|
2
|
+
import { QueryBuilder as QueryBuilderInterface } from '../Contracts/Database';
|
|
3
|
+
export declare class QueryBuilder implements QueryBuilderInterface {
|
|
4
|
+
private connection;
|
|
5
|
+
private tableName?;
|
|
6
|
+
private selectColumns;
|
|
7
|
+
private whereClauses;
|
|
8
|
+
private orderByColumns;
|
|
9
|
+
private limitValue?;
|
|
10
|
+
private offsetValue?;
|
|
11
|
+
private resolvedConnection;
|
|
12
|
+
constructor(connection: Connection | Promise<Connection>);
|
|
13
|
+
/**
|
|
14
|
+
* Get the resolved connection
|
|
15
|
+
*/
|
|
16
|
+
private getResolvedConnection;
|
|
17
|
+
/**
|
|
18
|
+
* Set the table for the query
|
|
19
|
+
*/
|
|
20
|
+
table(table: string): this;
|
|
21
|
+
/**
|
|
22
|
+
* Add a select clause
|
|
23
|
+
*/
|
|
24
|
+
select(...columns: string[]): this;
|
|
25
|
+
/**
|
|
26
|
+
* Add a where clause
|
|
27
|
+
*/
|
|
28
|
+
where(column: string, operator: any, value?: any): this;
|
|
29
|
+
/**
|
|
30
|
+
* Add an OR where clause
|
|
31
|
+
*/
|
|
32
|
+
orWhere(column: string, operator: any, value?: any): this;
|
|
33
|
+
/**
|
|
34
|
+
* Add a where in clause
|
|
35
|
+
*/
|
|
36
|
+
whereIn(column: string, values: any[]): this;
|
|
37
|
+
/**
|
|
38
|
+
* Add a where not in clause
|
|
39
|
+
*/
|
|
40
|
+
whereNotIn(column: string, values: any[]): this;
|
|
41
|
+
/**
|
|
42
|
+
* Add a where null clause
|
|
43
|
+
*/
|
|
44
|
+
whereNull(column: string): this;
|
|
45
|
+
/**
|
|
46
|
+
* Add a where not null clause
|
|
47
|
+
*/
|
|
48
|
+
whereNotNull(column: string): this;
|
|
49
|
+
/**
|
|
50
|
+
* Add an order by clause
|
|
51
|
+
*/
|
|
52
|
+
orderBy(column: string, direction?: 'asc' | 'desc'): this;
|
|
53
|
+
/**
|
|
54
|
+
* Add a limit clause
|
|
55
|
+
*/
|
|
56
|
+
limit(limit: number): this;
|
|
57
|
+
/**
|
|
58
|
+
* Add an offset clause
|
|
59
|
+
*/
|
|
60
|
+
offset(offset: number): this;
|
|
61
|
+
/**
|
|
62
|
+
* Execute the query and get all results
|
|
63
|
+
*/
|
|
64
|
+
get(): Promise<any[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Execute the query and get the first result
|
|
67
|
+
*/
|
|
68
|
+
first(): Promise<any | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Insert a record
|
|
71
|
+
*/
|
|
72
|
+
insert(data: Record<string, any>): Promise<any>;
|
|
73
|
+
/**
|
|
74
|
+
* Update records
|
|
75
|
+
*/
|
|
76
|
+
update(data: Record<string, any>): Promise<number>;
|
|
77
|
+
/**
|
|
78
|
+
* Delete records
|
|
79
|
+
*/
|
|
80
|
+
delete(): Promise<number>;
|
|
81
|
+
/**
|
|
82
|
+
* Get the count of records
|
|
83
|
+
*/
|
|
84
|
+
count(column?: string): Promise<number>;
|
|
85
|
+
/**
|
|
86
|
+
* Build the SELECT query
|
|
87
|
+
*/
|
|
88
|
+
private buildSelectQuery;
|
|
89
|
+
/**
|
|
90
|
+
* Build the WHERE clause
|
|
91
|
+
*/
|
|
92
|
+
private buildWhereClause;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=QueryBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../src/Query/QueryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,IAAI,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAa9E,qBAAa,YAAa,YAAW,qBAAqB;IAS1C,OAAO,CAAC,UAAU;IAR9B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,cAAc,CAA4D;IAClF,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,kBAAkB,CAA2B;gBAEjC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAEhE;;OAEG;YACW,qBAAqB;IAOnC;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACH,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKlC;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IAkBvD;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IAkBzD;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI;IAW5C;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI;IAW/C;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU/B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUlC;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,KAAK,GAAG,MAAc,GAAG,IAAI;IAKhE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAM3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAMlC;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAcrD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBxD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAa/B;;OAEG;IACG,KAAK,CAAC,MAAM,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAalD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA4C3B"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryBuilder = void 0;
|
|
4
|
+
class QueryBuilder {
|
|
5
|
+
constructor(connection) {
|
|
6
|
+
this.connection = connection;
|
|
7
|
+
this.selectColumns = ['*'];
|
|
8
|
+
this.whereClauses = [];
|
|
9
|
+
this.orderByColumns = [];
|
|
10
|
+
this.resolvedConnection = null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get the resolved connection
|
|
14
|
+
*/
|
|
15
|
+
async getResolvedConnection() {
|
|
16
|
+
if (!this.resolvedConnection) {
|
|
17
|
+
this.resolvedConnection = await this.connection;
|
|
18
|
+
}
|
|
19
|
+
return this.resolvedConnection;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set the table for the query
|
|
23
|
+
*/
|
|
24
|
+
table(table) {
|
|
25
|
+
this.tableName = table;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Add a select clause
|
|
30
|
+
*/
|
|
31
|
+
select(...columns) {
|
|
32
|
+
this.selectColumns = columns;
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Add a where clause
|
|
37
|
+
*/
|
|
38
|
+
where(column, operator, value) {
|
|
39
|
+
// Handle where(column, value) syntax
|
|
40
|
+
if (value === undefined) {
|
|
41
|
+
value = operator;
|
|
42
|
+
operator = '=';
|
|
43
|
+
}
|
|
44
|
+
this.whereClauses.push({
|
|
45
|
+
type: 'basic',
|
|
46
|
+
column,
|
|
47
|
+
operator,
|
|
48
|
+
value,
|
|
49
|
+
boolean: 'and',
|
|
50
|
+
});
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Add an OR where clause
|
|
55
|
+
*/
|
|
56
|
+
orWhere(column, operator, value) {
|
|
57
|
+
// Handle orWhere(column, value) syntax
|
|
58
|
+
if (value === undefined) {
|
|
59
|
+
value = operator;
|
|
60
|
+
operator = '=';
|
|
61
|
+
}
|
|
62
|
+
this.whereClauses.push({
|
|
63
|
+
type: 'basic',
|
|
64
|
+
column,
|
|
65
|
+
operator,
|
|
66
|
+
value,
|
|
67
|
+
boolean: 'or',
|
|
68
|
+
});
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Add a where in clause
|
|
73
|
+
*/
|
|
74
|
+
whereIn(column, values) {
|
|
75
|
+
this.whereClauses.push({
|
|
76
|
+
type: 'in',
|
|
77
|
+
column,
|
|
78
|
+
value: values,
|
|
79
|
+
boolean: 'and',
|
|
80
|
+
});
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Add a where not in clause
|
|
85
|
+
*/
|
|
86
|
+
whereNotIn(column, values) {
|
|
87
|
+
this.whereClauses.push({
|
|
88
|
+
type: 'notIn',
|
|
89
|
+
column,
|
|
90
|
+
value: values,
|
|
91
|
+
boolean: 'and',
|
|
92
|
+
});
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Add a where null clause
|
|
97
|
+
*/
|
|
98
|
+
whereNull(column) {
|
|
99
|
+
this.whereClauses.push({
|
|
100
|
+
type: 'null',
|
|
101
|
+
column,
|
|
102
|
+
boolean: 'and',
|
|
103
|
+
});
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Add a where not null clause
|
|
108
|
+
*/
|
|
109
|
+
whereNotNull(column) {
|
|
110
|
+
this.whereClauses.push({
|
|
111
|
+
type: 'notNull',
|
|
112
|
+
column,
|
|
113
|
+
boolean: 'and',
|
|
114
|
+
});
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Add an order by clause
|
|
119
|
+
*/
|
|
120
|
+
orderBy(column, direction = 'asc') {
|
|
121
|
+
this.orderByColumns.push({ column, direction });
|
|
122
|
+
return this;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Add a limit clause
|
|
126
|
+
*/
|
|
127
|
+
limit(limit) {
|
|
128
|
+
this.limitValue = limit;
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Add an offset clause
|
|
133
|
+
*/
|
|
134
|
+
offset(offset) {
|
|
135
|
+
this.offsetValue = offset;
|
|
136
|
+
return this;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Execute the query and get all results
|
|
140
|
+
*/
|
|
141
|
+
async get() {
|
|
142
|
+
const { sql, bindings } = this.buildSelectQuery();
|
|
143
|
+
const connection = await this.getResolvedConnection();
|
|
144
|
+
return await connection.query(sql, bindings);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Execute the query and get the first result
|
|
148
|
+
*/
|
|
149
|
+
async first() {
|
|
150
|
+
this.limit(1);
|
|
151
|
+
const results = await this.get();
|
|
152
|
+
return results.length > 0 ? results[0] : null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Insert a record
|
|
156
|
+
*/
|
|
157
|
+
async insert(data) {
|
|
158
|
+
if (!this.tableName) {
|
|
159
|
+
throw new Error('Table name is required');
|
|
160
|
+
}
|
|
161
|
+
const columns = Object.keys(data);
|
|
162
|
+
const values = Object.values(data);
|
|
163
|
+
const placeholders = values.map((_, i) => `?`).join(', ');
|
|
164
|
+
const sql = `INSERT INTO ${this.tableName} (${columns.join(', ')}) VALUES (${placeholders})`;
|
|
165
|
+
const connection = await this.getResolvedConnection();
|
|
166
|
+
return await connection.query(sql, values);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Update records
|
|
170
|
+
*/
|
|
171
|
+
async update(data) {
|
|
172
|
+
if (!this.tableName) {
|
|
173
|
+
throw new Error('Table name is required');
|
|
174
|
+
}
|
|
175
|
+
const columns = Object.keys(data);
|
|
176
|
+
const values = Object.values(data);
|
|
177
|
+
const setClause = columns.map(col => `${col} = ?`).join(', ');
|
|
178
|
+
const { whereClause, bindings: whereBindings } = this.buildWhereClause();
|
|
179
|
+
const sql = `UPDATE ${this.tableName} SET ${setClause}${whereClause}`;
|
|
180
|
+
const connection = await this.getResolvedConnection();
|
|
181
|
+
const result = await connection.query(sql, [...values, ...whereBindings]);
|
|
182
|
+
return result.affectedRows || result.rowCount || 0;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Delete records
|
|
186
|
+
*/
|
|
187
|
+
async delete() {
|
|
188
|
+
if (!this.tableName) {
|
|
189
|
+
throw new Error('Table name is required');
|
|
190
|
+
}
|
|
191
|
+
const { whereClause, bindings } = this.buildWhereClause();
|
|
192
|
+
const sql = `DELETE FROM ${this.tableName}${whereClause}`;
|
|
193
|
+
const connection = await this.getResolvedConnection();
|
|
194
|
+
const result = await connection.query(sql, bindings);
|
|
195
|
+
return result.affectedRows || result.rowCount || 0;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get the count of records
|
|
199
|
+
*/
|
|
200
|
+
async count(column = '*') {
|
|
201
|
+
if (!this.tableName) {
|
|
202
|
+
throw new Error('Table name is required');
|
|
203
|
+
}
|
|
204
|
+
const { whereClause, bindings } = this.buildWhereClause();
|
|
205
|
+
const sql = `SELECT COUNT(${column}) as count FROM ${this.tableName}${whereClause}`;
|
|
206
|
+
const connection = await this.getResolvedConnection();
|
|
207
|
+
const result = await connection.query(sql, bindings);
|
|
208
|
+
return parseInt(result[0].count);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Build the SELECT query
|
|
212
|
+
*/
|
|
213
|
+
buildSelectQuery() {
|
|
214
|
+
if (!this.tableName) {
|
|
215
|
+
throw new Error('Table name is required');
|
|
216
|
+
}
|
|
217
|
+
const columns = this.selectColumns.join(', ');
|
|
218
|
+
let sql = `SELECT ${columns} FROM ${this.tableName}`;
|
|
219
|
+
const { whereClause, bindings } = this.buildWhereClause();
|
|
220
|
+
sql += whereClause;
|
|
221
|
+
if (this.orderByColumns.length > 0) {
|
|
222
|
+
const orderBy = this.orderByColumns
|
|
223
|
+
.map(({ column, direction }) => `${column} ${direction.toUpperCase()}`)
|
|
224
|
+
.join(', ');
|
|
225
|
+
sql += ` ORDER BY ${orderBy}`;
|
|
226
|
+
}
|
|
227
|
+
if (this.limitValue !== undefined) {
|
|
228
|
+
sql += ` LIMIT ${this.limitValue}`;
|
|
229
|
+
}
|
|
230
|
+
if (this.offsetValue !== undefined) {
|
|
231
|
+
sql += ` OFFSET ${this.offsetValue}`;
|
|
232
|
+
}
|
|
233
|
+
return { sql, bindings };
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Build the WHERE clause
|
|
237
|
+
*/
|
|
238
|
+
buildWhereClause() {
|
|
239
|
+
if (this.whereClauses.length === 0) {
|
|
240
|
+
return { whereClause: '', bindings: [] };
|
|
241
|
+
}
|
|
242
|
+
const bindings = [];
|
|
243
|
+
const clauses = [];
|
|
244
|
+
this.whereClauses.forEach((where, index) => {
|
|
245
|
+
const boolean = index === 0 ? '' : ` ${where.boolean.toUpperCase()} `;
|
|
246
|
+
switch (where.type) {
|
|
247
|
+
case 'basic':
|
|
248
|
+
clauses.push(`${boolean}${where.column} ${where.operator} ?`);
|
|
249
|
+
bindings.push(where.value);
|
|
250
|
+
break;
|
|
251
|
+
case 'in':
|
|
252
|
+
const inPlaceholders = where.value.map(() => '?').join(', ');
|
|
253
|
+
clauses.push(`${boolean}${where.column} IN (${inPlaceholders})`);
|
|
254
|
+
bindings.push(...where.value);
|
|
255
|
+
break;
|
|
256
|
+
case 'notIn':
|
|
257
|
+
const notInPlaceholders = where.value.map(() => '?').join(', ');
|
|
258
|
+
clauses.push(`${boolean}${where.column} NOT IN (${notInPlaceholders})`);
|
|
259
|
+
bindings.push(...where.value);
|
|
260
|
+
break;
|
|
261
|
+
case 'null':
|
|
262
|
+
clauses.push(`${boolean}${where.column} IS NULL`);
|
|
263
|
+
break;
|
|
264
|
+
case 'notNull':
|
|
265
|
+
clauses.push(`${boolean}${where.column} IS NOT NULL`);
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
return {
|
|
270
|
+
whereClause: ' WHERE ' + clauses.join(''),
|
|
271
|
+
bindings,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
exports.QueryBuilder = QueryBuilder;
|
|
276
|
+
//# sourceMappingURL=QueryBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../src/Query/QueryBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { TableBlueprint, ColumnDefinition } from '../Schema';
|
|
2
|
+
/**
|
|
3
|
+
* Base grammar class for schema building
|
|
4
|
+
*/
|
|
5
|
+
export declare abstract class Grammar {
|
|
6
|
+
/**
|
|
7
|
+
* Compile the create table SQL
|
|
8
|
+
*/
|
|
9
|
+
abstract compileCreate(blueprint: TableBlueprint): string;
|
|
10
|
+
/**
|
|
11
|
+
* Compile the drop table SQL
|
|
12
|
+
*/
|
|
13
|
+
abstract compileDrop(tableName: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Compile the drop table if exists SQL
|
|
16
|
+
*/
|
|
17
|
+
abstract compileDropIfExists(tableName: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Map a column definition to its SQL type
|
|
20
|
+
*/
|
|
21
|
+
protected abstract getType(column: ColumnDefinition): string;
|
|
22
|
+
/**
|
|
23
|
+
* Get the default value SQL
|
|
24
|
+
*/
|
|
25
|
+
protected getDefault(column: ColumnDefinition): string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=Grammar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grammar.d.ts","sourceRoot":"","sources":["../../../src/Schema/Grammars/Grammar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7D;;GAEG;AACH,8BAAsB,OAAO;IACzB;;OAEG;aACa,aAAa,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM;IAEhE;;OAEG;aACa,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAEtD;;OAEG;aACa,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAE9D;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAE5D;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;CAYzD"}
|