bettersqlkeza 1.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.
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/dist/bettersql.d.ts +107 -0
- package/dist/bettersql.d.ts.map +1 -0
- package/dist/bettersql.js +181 -0
- package/dist/bettersql.js.map +1 -0
- package/dist/delete-builder.d.ts +58 -0
- package/dist/delete-builder.d.ts.map +1 -0
- package/dist/delete-builder.js +129 -0
- package/dist/delete-builder.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/insert-builder.d.ts +62 -0
- package/dist/insert-builder.d.ts.map +1 -0
- package/dist/insert-builder.js +136 -0
- package/dist/insert-builder.js.map +1 -0
- package/dist/model.d.ts +185 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +404 -0
- package/dist/model.js.map +1 -0
- package/dist/query-builder.d.ts +140 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +298 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/raw-query-builder.d.ts +70 -0
- package/dist/raw-query-builder.d.ts.map +1 -0
- package/dist/raw-query-builder.js +118 -0
- package/dist/raw-query-builder.js.map +1 -0
- package/dist/result-proxy.d.ts +63 -0
- package/dist/result-proxy.d.ts.map +1 -0
- package/dist/result-proxy.js +166 -0
- package/dist/result-proxy.js.map +1 -0
- package/dist/types.d.ts +87 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/update-builder.d.ts +59 -0
- package/dist/update-builder.d.ts.map +1 -0
- package/dist/update-builder.js +136 -0
- package/dist/update-builder.js.map +1 -0
- package/dist/where-builder.d.ts +18 -0
- package/dist/where-builder.d.ts.map +1 -0
- package/dist/where-builder.js +117 -0
- package/dist/where-builder.js.map +1 -0
- package/package.json +48 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BetterSQL - A minimal high performance ORM for Node.js using better-sqlite3
|
|
3
|
+
*
|
|
4
|
+
* Thin and SQL first with no decorators, no reflection, no runtime magic.
|
|
5
|
+
* Built directly on better-sqlite3 with cached prepared statements,
|
|
6
|
+
* transaction support, and strong TypeScript inference.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { BetterSQL } from "@keza/bettersql";
|
|
11
|
+
*
|
|
12
|
+
* const ql = new BetterSQL({ filename: ":memory:" });
|
|
13
|
+
*
|
|
14
|
+
* const User = ql.define("user", {
|
|
15
|
+
* id: { type: "INTEGER", primary: true, autoIncrement: true },
|
|
16
|
+
* email: { type: "TEXT", unique: true },
|
|
17
|
+
* username: { type: "TEXT" },
|
|
18
|
+
* created_at: { type: "INTEGER" }
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // Insert a new user
|
|
22
|
+
* const user = User.insert({ email: "a@mail.com", username: "alice", created_at: Date.now() });
|
|
23
|
+
*
|
|
24
|
+
* // Insert with existence check (avoids UNIQUE constraint errors)
|
|
25
|
+
* const user2 = User.insertBuilder({ email: "a@mail.com", username: "alice" })
|
|
26
|
+
* .ifNotExists({ email: "a@mail.com" })
|
|
27
|
+
* .run();
|
|
28
|
+
*
|
|
29
|
+
* // Query users
|
|
30
|
+
* const found = User.find({ email: "a@mail.com" }).first();
|
|
31
|
+
* const all = User.find().all();
|
|
32
|
+
* const byId = User.findById(1);
|
|
33
|
+
*
|
|
34
|
+
* // Chainable methods on results (methods that never end)
|
|
35
|
+
* const contact = User.query().where("id", "=", 1).first();
|
|
36
|
+
* contact?.delete(); // Delete the record
|
|
37
|
+
* contact?.update({ username: "new_name" }); // Update the record
|
|
38
|
+
* contact?.username; // Access property
|
|
39
|
+
*
|
|
40
|
+
* // Raw SQL queries
|
|
41
|
+
* const results = User.query("SELECT * FROM user WHERE status = 'active'");
|
|
42
|
+
* const paramResults = User.query("SELECT * FROM user WHERE id = ?", [1]);
|
|
43
|
+
*
|
|
44
|
+
* // Update (immediate execution)
|
|
45
|
+
* User.update({ email: "a@mail.com" }, { username: "alice_updated" });
|
|
46
|
+
*
|
|
47
|
+
* // Update (builder pattern)
|
|
48
|
+
* User.update({ username: "alice_updated" }).where("email", "=", "a@mail.com").run();
|
|
49
|
+
*
|
|
50
|
+
* // Delete (immediate execution)
|
|
51
|
+
* User.delete({ email: "a@mail.com" });
|
|
52
|
+
*
|
|
53
|
+
* // Delete (builder pattern)
|
|
54
|
+
* User.delete().where({ status: "inactive" }).orWhere({ expired: true }).run();
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export { BetterSQL } from './bettersql';
|
|
58
|
+
export { Model } from './model';
|
|
59
|
+
export { QueryBuilder } from './query-builder';
|
|
60
|
+
export { RawQueryBuilder } from './raw-query-builder';
|
|
61
|
+
export { DeleteBuilder } from './delete-builder';
|
|
62
|
+
export { UpdateBuilder } from './update-builder';
|
|
63
|
+
export { InsertBuilder } from './insert-builder';
|
|
64
|
+
export { ResultProxy, createResultProxy } from './result-proxy';
|
|
65
|
+
export type { ConflictResolution } from './insert-builder';
|
|
66
|
+
export type { AdvancedWhereCondition, AggregateFunction, AndCondition, BetterSQLConfig, ColumnDefinition, ColumnType, ComparisonOperator, InferSchemaType, OrderBy, OrderDirection, OrCondition, QueryOptions, SchemaDefinition, SQLQueryBindings, TransactionCallback, UpdateData, WhereCondition, WhereOperator, WhereValue } from './types';
|
|
67
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,YAAY,EACV,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,OAAO,EACP,cAAc,EACd,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACX,MAAM,SAAS,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BetterSQL - A minimal high performance ORM for Node.js using better-sqlite3
|
|
4
|
+
*
|
|
5
|
+
* Thin and SQL first with no decorators, no reflection, no runtime magic.
|
|
6
|
+
* Built directly on better-sqlite3 with cached prepared statements,
|
|
7
|
+
* transaction support, and strong TypeScript inference.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { BetterSQL } from "@keza/bettersql";
|
|
12
|
+
*
|
|
13
|
+
* const ql = new BetterSQL({ filename: ":memory:" });
|
|
14
|
+
*
|
|
15
|
+
* const User = ql.define("user", {
|
|
16
|
+
* id: { type: "INTEGER", primary: true, autoIncrement: true },
|
|
17
|
+
* email: { type: "TEXT", unique: true },
|
|
18
|
+
* username: { type: "TEXT" },
|
|
19
|
+
* created_at: { type: "INTEGER" }
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Insert a new user
|
|
23
|
+
* const user = User.insert({ email: "a@mail.com", username: "alice", created_at: Date.now() });
|
|
24
|
+
*
|
|
25
|
+
* // Insert with existence check (avoids UNIQUE constraint errors)
|
|
26
|
+
* const user2 = User.insertBuilder({ email: "a@mail.com", username: "alice" })
|
|
27
|
+
* .ifNotExists({ email: "a@mail.com" })
|
|
28
|
+
* .run();
|
|
29
|
+
*
|
|
30
|
+
* // Query users
|
|
31
|
+
* const found = User.find({ email: "a@mail.com" }).first();
|
|
32
|
+
* const all = User.find().all();
|
|
33
|
+
* const byId = User.findById(1);
|
|
34
|
+
*
|
|
35
|
+
* // Chainable methods on results (methods that never end)
|
|
36
|
+
* const contact = User.query().where("id", "=", 1).first();
|
|
37
|
+
* contact?.delete(); // Delete the record
|
|
38
|
+
* contact?.update({ username: "new_name" }); // Update the record
|
|
39
|
+
* contact?.username; // Access property
|
|
40
|
+
*
|
|
41
|
+
* // Raw SQL queries
|
|
42
|
+
* const results = User.query("SELECT * FROM user WHERE status = 'active'");
|
|
43
|
+
* const paramResults = User.query("SELECT * FROM user WHERE id = ?", [1]);
|
|
44
|
+
*
|
|
45
|
+
* // Update (immediate execution)
|
|
46
|
+
* User.update({ email: "a@mail.com" }, { username: "alice_updated" });
|
|
47
|
+
*
|
|
48
|
+
* // Update (builder pattern)
|
|
49
|
+
* User.update({ username: "alice_updated" }).where("email", "=", "a@mail.com").run();
|
|
50
|
+
*
|
|
51
|
+
* // Delete (immediate execution)
|
|
52
|
+
* User.delete({ email: "a@mail.com" });
|
|
53
|
+
*
|
|
54
|
+
* // Delete (builder pattern)
|
|
55
|
+
* User.delete().where({ status: "inactive" }).orWhere({ expired: true }).run();
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.createResultProxy = exports.ResultProxy = exports.InsertBuilder = exports.UpdateBuilder = exports.DeleteBuilder = exports.RawQueryBuilder = exports.QueryBuilder = exports.Model = exports.BetterSQL = void 0;
|
|
60
|
+
var bettersql_1 = require("./bettersql");
|
|
61
|
+
Object.defineProperty(exports, "BetterSQL", { enumerable: true, get: function () { return bettersql_1.BetterSQL; } });
|
|
62
|
+
var model_1 = require("./model");
|
|
63
|
+
Object.defineProperty(exports, "Model", { enumerable: true, get: function () { return model_1.Model; } });
|
|
64
|
+
var query_builder_1 = require("./query-builder");
|
|
65
|
+
Object.defineProperty(exports, "QueryBuilder", { enumerable: true, get: function () { return query_builder_1.QueryBuilder; } });
|
|
66
|
+
var raw_query_builder_1 = require("./raw-query-builder");
|
|
67
|
+
Object.defineProperty(exports, "RawQueryBuilder", { enumerable: true, get: function () { return raw_query_builder_1.RawQueryBuilder; } });
|
|
68
|
+
var delete_builder_1 = require("./delete-builder");
|
|
69
|
+
Object.defineProperty(exports, "DeleteBuilder", { enumerable: true, get: function () { return delete_builder_1.DeleteBuilder; } });
|
|
70
|
+
var update_builder_1 = require("./update-builder");
|
|
71
|
+
Object.defineProperty(exports, "UpdateBuilder", { enumerable: true, get: function () { return update_builder_1.UpdateBuilder; } });
|
|
72
|
+
var insert_builder_1 = require("./insert-builder");
|
|
73
|
+
Object.defineProperty(exports, "InsertBuilder", { enumerable: true, get: function () { return insert_builder_1.InsertBuilder; } });
|
|
74
|
+
var result_proxy_1 = require("./result-proxy");
|
|
75
|
+
Object.defineProperty(exports, "ResultProxy", { enumerable: true, get: function () { return result_proxy_1.ResultProxy; } });
|
|
76
|
+
Object.defineProperty(exports, "createResultProxy", { enumerable: true, get: function () { return result_proxy_1.createResultProxy; } });
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;;;AAEH,yCAAuC;AAA9B,sGAAA,SAAS,OAAA;AAClB,iCAA+B;AAAtB,8FAAA,KAAK,OAAA;AACd,iDAA8C;AAArC,6GAAA,YAAY,OAAA;AACrB,yDAAqD;AAA5C,oHAAA,eAAe,OAAA;AACxB,mDAAgD;AAAvC,+GAAA,aAAa,OAAA;AACtB,mDAAgD;AAAvC,+GAAA,aAAa,OAAA;AACtB,mDAAgD;AAAvC,+GAAA,aAAa,OAAA;AACtB,+CAA+D;AAAtD,2GAAA,WAAW,OAAA;AAAE,iHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { SchemaDefinition, SQLQueryBindings, WhereCondition } from './types';
|
|
3
|
+
/** Conflict resolution strategy for INSERT operations */
|
|
4
|
+
export type ConflictResolution = 'abort' | 'ignore' | 'replace';
|
|
5
|
+
/**
|
|
6
|
+
* InsertBuilder<T> - A fluent query builder for constructing INSERT queries
|
|
7
|
+
* Queries are only executed when .run() is called
|
|
8
|
+
*/
|
|
9
|
+
export declare class InsertBuilder<T, S extends SchemaDefinition = SchemaDefinition> {
|
|
10
|
+
private db;
|
|
11
|
+
private tableName;
|
|
12
|
+
private _data;
|
|
13
|
+
private _conflictResolution;
|
|
14
|
+
private _checkCondition;
|
|
15
|
+
private statementCache;
|
|
16
|
+
private schema;
|
|
17
|
+
private primaryKey;
|
|
18
|
+
constructor(db: Database.Database, tableName: string, statementCache: Map<string, Database.Statement>, data: Partial<T>, schema: S, primaryKey?: string | null);
|
|
19
|
+
/**
|
|
20
|
+
* Check if a record already exists before inserting
|
|
21
|
+
* If a record matching the condition exists, the insert will be skipped
|
|
22
|
+
* @param condition - The WHERE condition to check for existing records
|
|
23
|
+
*/
|
|
24
|
+
ifNotExists(condition: WhereCondition<T>): InsertBuilder<T, S>;
|
|
25
|
+
/**
|
|
26
|
+
* Use INSERT OR IGNORE - silently skip if unique constraint fails
|
|
27
|
+
*/
|
|
28
|
+
orIgnore(): InsertBuilder<T, S>;
|
|
29
|
+
/**
|
|
30
|
+
* Use INSERT OR REPLACE - replace existing record if unique constraint fails
|
|
31
|
+
*/
|
|
32
|
+
orReplace(): InsertBuilder<T, S>;
|
|
33
|
+
/**
|
|
34
|
+
* Build the SQL query and parameters
|
|
35
|
+
*/
|
|
36
|
+
private buildQuery;
|
|
37
|
+
/**
|
|
38
|
+
* Get or create a cached prepared statement
|
|
39
|
+
*/
|
|
40
|
+
private getStatement;
|
|
41
|
+
/**
|
|
42
|
+
* Check if a record exists matching the condition
|
|
43
|
+
*/
|
|
44
|
+
private recordExists;
|
|
45
|
+
/**
|
|
46
|
+
* Find a record by its primary key
|
|
47
|
+
*/
|
|
48
|
+
private findById;
|
|
49
|
+
/**
|
|
50
|
+
* Execute the INSERT query and return the inserted record
|
|
51
|
+
* Returns null if the insert was skipped (due to ifNotExists check or orIgnore)
|
|
52
|
+
*/
|
|
53
|
+
run(): T | null;
|
|
54
|
+
/**
|
|
55
|
+
* Get the SQL string for debugging
|
|
56
|
+
*/
|
|
57
|
+
toSQL(): {
|
|
58
|
+
sql: string;
|
|
59
|
+
params: SQLQueryBindings[];
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=insert-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-builder.d.ts","sourceRoot":"","sources":["../src/insert-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAmB,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAGlG,yDAAyD;AACzD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE/D;;;GAGG;AACH,qBAAa,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IACzE,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,MAAM,CAAG;IACjB,OAAO,CAAC,UAAU,CAAsB;gBAGtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC/C,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,MAAM,EAAE,CAAC,EACT,UAAU,GAAE,MAAM,GAAG,IAAW;IAUlC;;;;OAIG;IACH,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAK9D;;OAEG;IACH,QAAQ,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAK/B;;OAEG;IACH,SAAS,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAKhC;;OAEG;IACH,OAAO,CAAC,UAAU;IAiBlB;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAUhB;;;OAGG;IACH,GAAG,IAAI,CAAC,GAAG,IAAI;IA0Bf;;OAEG;IACH,KAAK,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;KAAE;CAGrD"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InsertBuilder = void 0;
|
|
4
|
+
const where_builder_1 = require("./where-builder");
|
|
5
|
+
/**
|
|
6
|
+
* InsertBuilder<T> - A fluent query builder for constructing INSERT queries
|
|
7
|
+
* Queries are only executed when .run() is called
|
|
8
|
+
*/
|
|
9
|
+
class InsertBuilder {
|
|
10
|
+
db;
|
|
11
|
+
tableName;
|
|
12
|
+
_data;
|
|
13
|
+
_conflictResolution = 'abort';
|
|
14
|
+
_checkCondition = null;
|
|
15
|
+
statementCache;
|
|
16
|
+
schema;
|
|
17
|
+
primaryKey = null;
|
|
18
|
+
constructor(db, tableName, statementCache, data, schema, primaryKey = null) {
|
|
19
|
+
this.db = db;
|
|
20
|
+
this.tableName = tableName;
|
|
21
|
+
this.statementCache = statementCache;
|
|
22
|
+
this._data = data;
|
|
23
|
+
this.schema = schema;
|
|
24
|
+
this.primaryKey = primaryKey;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if a record already exists before inserting
|
|
28
|
+
* If a record matching the condition exists, the insert will be skipped
|
|
29
|
+
* @param condition - The WHERE condition to check for existing records
|
|
30
|
+
*/
|
|
31
|
+
ifNotExists(condition) {
|
|
32
|
+
this._checkCondition = condition;
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Use INSERT OR IGNORE - silently skip if unique constraint fails
|
|
37
|
+
*/
|
|
38
|
+
orIgnore() {
|
|
39
|
+
this._conflictResolution = 'ignore';
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Use INSERT OR REPLACE - replace existing record if unique constraint fails
|
|
44
|
+
*/
|
|
45
|
+
orReplace() {
|
|
46
|
+
this._conflictResolution = 'replace';
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build the SQL query and parameters
|
|
51
|
+
*/
|
|
52
|
+
buildQuery() {
|
|
53
|
+
const keys = Object.keys(this._data);
|
|
54
|
+
const values = Object.values(this._data);
|
|
55
|
+
const placeholders = keys.map(() => '?').join(', ');
|
|
56
|
+
const columns = keys.map((k) => `"${k}"`).join(', ');
|
|
57
|
+
let insertKeyword = 'INSERT';
|
|
58
|
+
if (this._conflictResolution === 'ignore') {
|
|
59
|
+
insertKeyword = 'INSERT OR IGNORE';
|
|
60
|
+
}
|
|
61
|
+
else if (this._conflictResolution === 'replace') {
|
|
62
|
+
insertKeyword = 'INSERT OR REPLACE';
|
|
63
|
+
}
|
|
64
|
+
const sql = `${insertKeyword} INTO "${this.tableName}" (${columns}) VALUES (${placeholders})`;
|
|
65
|
+
return { sql, params: values };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get or create a cached prepared statement
|
|
69
|
+
*/
|
|
70
|
+
getStatement(sql) {
|
|
71
|
+
let stmt = this.statementCache.get(sql);
|
|
72
|
+
if (!stmt) {
|
|
73
|
+
stmt = this.db.prepare(sql);
|
|
74
|
+
this.statementCache.set(sql, stmt);
|
|
75
|
+
}
|
|
76
|
+
return stmt;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if a record exists matching the condition
|
|
80
|
+
*/
|
|
81
|
+
recordExists(condition) {
|
|
82
|
+
const params = [];
|
|
83
|
+
const whereClause = (0, where_builder_1.buildWhereClause)(condition, params);
|
|
84
|
+
if (!whereClause) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
const sql = `SELECT EXISTS(SELECT 1 FROM "${this.tableName}" WHERE ${whereClause}) as exists_result`;
|
|
88
|
+
const stmt = this.db.prepare(sql);
|
|
89
|
+
const result = stmt.get(...params);
|
|
90
|
+
return result.exists_result === 1;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Find a record by its primary key
|
|
94
|
+
*/
|
|
95
|
+
findById(id) {
|
|
96
|
+
if (!this.primaryKey) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const sql = `SELECT * FROM "${this.tableName}" WHERE "${this.primaryKey}" = ?`;
|
|
100
|
+
const stmt = this.getStatement(sql);
|
|
101
|
+
return stmt.get(id) || null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Execute the INSERT query and return the inserted record
|
|
105
|
+
* Returns null if the insert was skipped (due to ifNotExists check or orIgnore)
|
|
106
|
+
*/
|
|
107
|
+
run() {
|
|
108
|
+
// Check if record already exists if ifNotExists was called
|
|
109
|
+
if (this._checkCondition !== null) {
|
|
110
|
+
if (this.recordExists(this._checkCondition)) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const { sql, params } = this.buildQuery();
|
|
115
|
+
const stmt = this.getStatement(sql);
|
|
116
|
+
const info = stmt.run(...params);
|
|
117
|
+
// Use the changes and lastInsertRowid from stmt.run() return value (more efficient)
|
|
118
|
+
if (info.changes === 0) {
|
|
119
|
+
// No row was inserted (could be due to OR IGNORE)
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
if (this.primaryKey) {
|
|
123
|
+
return this.findById(Number(info.lastInsertRowid));
|
|
124
|
+
}
|
|
125
|
+
// If no primary key, return the inserted data
|
|
126
|
+
return { ...this._data };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get the SQL string for debugging
|
|
130
|
+
*/
|
|
131
|
+
toSQL() {
|
|
132
|
+
return this.buildQuery();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.InsertBuilder = InsertBuilder;
|
|
136
|
+
//# sourceMappingURL=insert-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-builder.js","sourceRoot":"","sources":["../src/insert-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/model.d.ts
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { InferSchemaType, SchemaDefinition, SQLQueryBindings, UpdateData, WhereCondition } from './types';
|
|
3
|
+
import { QueryBuilder } from './query-builder';
|
|
4
|
+
import { RawQueryBuilder } from './raw-query-builder';
|
|
5
|
+
import { DeleteBuilder } from './delete-builder';
|
|
6
|
+
import { UpdateBuilder } from './update-builder';
|
|
7
|
+
import { InsertBuilder } from './insert-builder';
|
|
8
|
+
import { ResultProxy } from './result-proxy';
|
|
9
|
+
/**
|
|
10
|
+
* Model<T> - Represents a database table with typed CRUD operations
|
|
11
|
+
*/
|
|
12
|
+
export declare class Model<S extends SchemaDefinition> {
|
|
13
|
+
private db;
|
|
14
|
+
private tableName;
|
|
15
|
+
private schema;
|
|
16
|
+
private statementCache;
|
|
17
|
+
private primaryKey;
|
|
18
|
+
constructor(db: Database.Database, tableName: string, schema: S, statementCache: Map<string, Database.Statement>);
|
|
19
|
+
/**
|
|
20
|
+
* Get or create a cached prepared statement
|
|
21
|
+
*/
|
|
22
|
+
private getStatement;
|
|
23
|
+
/**
|
|
24
|
+
* Create a QueryBuilder with optional initial WHERE conditions
|
|
25
|
+
*/
|
|
26
|
+
find(where?: WhereCondition<InferSchemaType<S>>): QueryBuilder<InferSchemaType<S>>;
|
|
27
|
+
/**
|
|
28
|
+
* Create a QueryBuilder for SELECT queries with fluent chaining
|
|
29
|
+
* @example
|
|
30
|
+
* const users = User.select().where("lid", "=", id).get();
|
|
31
|
+
* const activeUsers = User.select().where({ status: "active" }).orderBy("name").all();
|
|
32
|
+
*/
|
|
33
|
+
select(where?: WhereCondition<InferSchemaType<S>>): QueryBuilder<InferSchemaType<S>>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a QueryBuilder for SELECT queries with fluent chaining, or execute raw SQL
|
|
36
|
+
* Alias for select() method, providing a more intuitive API for querying
|
|
37
|
+
* @overload query(where) - Create a QueryBuilder with optional initial WHERE conditions
|
|
38
|
+
* @overload query(rawSql) - Execute raw SQL query and return results
|
|
39
|
+
* @overload query(rawSql, params) - Execute raw SQL query with parameters
|
|
40
|
+
* @example
|
|
41
|
+
* // QueryBuilder pattern
|
|
42
|
+
* const contact = Contact.query().where("lid", "=", lid).first();
|
|
43
|
+
* const users = User.query().where("status", "=", "active").all();
|
|
44
|
+
*
|
|
45
|
+
* // Raw SQL pattern
|
|
46
|
+
* const results = User.query("SELECT * FROM user WHERE status = 'active'");
|
|
47
|
+
* const paramResults = User.query("SELECT * FROM user WHERE id = ?", [1]);
|
|
48
|
+
*/
|
|
49
|
+
query(rawSql: string, params?: SQLQueryBindings[]): RawQueryBuilder<InferSchemaType<S>>;
|
|
50
|
+
query(where?: WhereCondition<InferSchemaType<S>>): QueryBuilder<InferSchemaType<S>>;
|
|
51
|
+
/**
|
|
52
|
+
* Find a record by its primary key
|
|
53
|
+
* Returns a result with chainable methods like delete(), update(), save()
|
|
54
|
+
*/
|
|
55
|
+
findById(id: number | string): (InferSchemaType<S> & ResultProxy<InferSchemaType<S>>) | null;
|
|
56
|
+
/**
|
|
57
|
+
* Insert a new record (immediate execution)
|
|
58
|
+
*/
|
|
59
|
+
insert(data: Partial<InferSchemaType<S>>): InferSchemaType<S>;
|
|
60
|
+
/**
|
|
61
|
+
* Create an InsertBuilder for fluent chaining with options like ifNotExists, orIgnore, orReplace
|
|
62
|
+
* @example
|
|
63
|
+
* // Insert with existence check (avoids UNIQUE constraint errors)
|
|
64
|
+
* const user = User.insertBuilder({ email: "test@example.com", name: "Test" })
|
|
65
|
+
* .ifNotExists({ email: "test@example.com" })
|
|
66
|
+
* .run();
|
|
67
|
+
*
|
|
68
|
+
* // Insert with OR IGNORE (silently skip on conflict)
|
|
69
|
+
* const user = User.insertBuilder({ email: "test@example.com", name: "Test" })
|
|
70
|
+
* .orIgnore()
|
|
71
|
+
* .run();
|
|
72
|
+
*
|
|
73
|
+
* // Insert with OR REPLACE (replace on conflict)
|
|
74
|
+
* const user = User.insertBuilder({ email: "test@example.com", name: "Test" })
|
|
75
|
+
* .orReplace()
|
|
76
|
+
* .run();
|
|
77
|
+
*/
|
|
78
|
+
insertBuilder(data: Partial<InferSchemaType<S>>): InsertBuilder<InferSchemaType<S>, S>;
|
|
79
|
+
/**
|
|
80
|
+
* Insert multiple records at once
|
|
81
|
+
*/
|
|
82
|
+
insertMany(dataArray: Partial<InferSchemaType<S>>[]): InferSchemaType<S>[];
|
|
83
|
+
/**
|
|
84
|
+
* Update records matching the WHERE conditions or return an UpdateBuilder for chaining
|
|
85
|
+
* @overload When called with just data, returns an UpdateBuilder for fluent chaining
|
|
86
|
+
* @overload When called with a WhereCondition and data, executes immediately and returns the count
|
|
87
|
+
*/
|
|
88
|
+
update(data: UpdateData<InferSchemaType<S>>): UpdateBuilder<InferSchemaType<S>>;
|
|
89
|
+
update(where: WhereCondition<InferSchemaType<S>>, data: UpdateData<InferSchemaType<S>>): number;
|
|
90
|
+
/**
|
|
91
|
+
* Update a record by its primary key
|
|
92
|
+
*/
|
|
93
|
+
updateById(id: number | string, data: UpdateData<InferSchemaType<S>>): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Delete records matching the WHERE conditions or return a DeleteBuilder for chaining
|
|
96
|
+
* @overload When called with no arguments, returns a DeleteBuilder for fluent chaining
|
|
97
|
+
* @overload When called with a WhereCondition, executes immediately and returns the count
|
|
98
|
+
*/
|
|
99
|
+
delete(): DeleteBuilder<InferSchemaType<S>>;
|
|
100
|
+
delete(where: WhereCondition<InferSchemaType<S>>): number;
|
|
101
|
+
/**
|
|
102
|
+
* Delete a record by its primary key
|
|
103
|
+
*/
|
|
104
|
+
deleteById(id: number | string): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Count records matching the WHERE conditions
|
|
107
|
+
*/
|
|
108
|
+
count(where?: WhereCondition<InferSchemaType<S>>): number;
|
|
109
|
+
/**
|
|
110
|
+
* Get all records from the table
|
|
111
|
+
*/
|
|
112
|
+
all(): InferSchemaType<S>[];
|
|
113
|
+
/**
|
|
114
|
+
* Insert or replace a record (upsert)
|
|
115
|
+
* Uses SQLite's INSERT OR REPLACE
|
|
116
|
+
*/
|
|
117
|
+
upsert(data: Partial<InferSchemaType<S>>): InferSchemaType<S>;
|
|
118
|
+
/**
|
|
119
|
+
* Insert or update on conflict (more granular upsert)
|
|
120
|
+
* Uses SQLite's INSERT ... ON CONFLICT DO UPDATE
|
|
121
|
+
*/
|
|
122
|
+
upsertOn(data: Partial<InferSchemaType<S>>, conflictColumns: (keyof InferSchemaType<S>)[], updateData?: UpdateData<InferSchemaType<S>>): InferSchemaType<S>;
|
|
123
|
+
/**
|
|
124
|
+
* Check if any records exist matching the conditions
|
|
125
|
+
*/
|
|
126
|
+
exists(where?: WhereCondition<InferSchemaType<S>>): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Find a record by primary key or throw an error
|
|
129
|
+
* Returns a result with chainable methods like delete(), update(), save()
|
|
130
|
+
*/
|
|
131
|
+
findByIdOrFail(id: number | string): InferSchemaType<S> & ResultProxy<InferSchemaType<S>>;
|
|
132
|
+
/**
|
|
133
|
+
* Get array of values for a single column
|
|
134
|
+
*/
|
|
135
|
+
pluck<K extends keyof InferSchemaType<S>>(column: K, where?: WhereCondition<InferSchemaType<S>>): InferSchemaType<S>[K][];
|
|
136
|
+
/**
|
|
137
|
+
* Get distinct values for a column
|
|
138
|
+
*/
|
|
139
|
+
distinct<K extends keyof InferSchemaType<S>>(column: K, where?: WhereCondition<InferSchemaType<S>>): InferSchemaType<S>[K][];
|
|
140
|
+
/**
|
|
141
|
+
* Get the sum of a column
|
|
142
|
+
*/
|
|
143
|
+
sum(column: keyof InferSchemaType<S>, where?: WhereCondition<InferSchemaType<S>>): number;
|
|
144
|
+
/**
|
|
145
|
+
* Get the average of a column
|
|
146
|
+
*/
|
|
147
|
+
avg(column: keyof InferSchemaType<S>, where?: WhereCondition<InferSchemaType<S>>): number;
|
|
148
|
+
/**
|
|
149
|
+
* Get the minimum value of a column
|
|
150
|
+
*/
|
|
151
|
+
min(column: keyof InferSchemaType<S>, where?: WhereCondition<InferSchemaType<S>>): number;
|
|
152
|
+
/**
|
|
153
|
+
* Get the maximum value of a column
|
|
154
|
+
*/
|
|
155
|
+
max(column: keyof InferSchemaType<S>, where?: WhereCondition<InferSchemaType<S>>): number;
|
|
156
|
+
/**
|
|
157
|
+
* Increment a column value
|
|
158
|
+
*/
|
|
159
|
+
increment(column: keyof InferSchemaType<S>, amount?: number, where?: WhereCondition<InferSchemaType<S>>): number;
|
|
160
|
+
/**
|
|
161
|
+
* Decrement a column value
|
|
162
|
+
*/
|
|
163
|
+
decrement(column: keyof InferSchemaType<S>, amount?: number, where?: WhereCondition<InferSchemaType<S>>): number;
|
|
164
|
+
/**
|
|
165
|
+
* Truncate the table (delete all records)
|
|
166
|
+
*/
|
|
167
|
+
truncate(): void;
|
|
168
|
+
/**
|
|
169
|
+
* Get the table name
|
|
170
|
+
*/
|
|
171
|
+
getTableName(): string;
|
|
172
|
+
/**
|
|
173
|
+
* Get the schema definition
|
|
174
|
+
*/
|
|
175
|
+
getSchema(): S;
|
|
176
|
+
/**
|
|
177
|
+
* Generate CREATE TABLE SQL for this model
|
|
178
|
+
*/
|
|
179
|
+
toCreateTableSQL(): string;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Generate CREATE TABLE SQL from schema definition
|
|
183
|
+
*/
|
|
184
|
+
export declare function generateCreateTableSQL(tableName: string, schema: SchemaDefinition): string;
|
|
185
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|