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
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResultProxy = void 0;
|
|
4
|
+
exports.createResultProxy = createResultProxy;
|
|
5
|
+
/**
|
|
6
|
+
* ResultProxy<T> - Wraps a query result with chainable methods
|
|
7
|
+
* Allows patterns like: Model.query().where(...).first().delete()
|
|
8
|
+
* While still allowing property access: Model.query().where(...).first().propertyName
|
|
9
|
+
*/
|
|
10
|
+
class ResultProxy {
|
|
11
|
+
db;
|
|
12
|
+
tableName;
|
|
13
|
+
statementCache;
|
|
14
|
+
primaryKey;
|
|
15
|
+
_data;
|
|
16
|
+
constructor(db, tableName, statementCache, primaryKey, data) {
|
|
17
|
+
this.db = db;
|
|
18
|
+
this.tableName = tableName;
|
|
19
|
+
this.statementCache = statementCache;
|
|
20
|
+
this.primaryKey = primaryKey;
|
|
21
|
+
this._data = data;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get or create a cached prepared statement
|
|
25
|
+
*/
|
|
26
|
+
getStatement(sql) {
|
|
27
|
+
let stmt = this.statementCache.get(sql);
|
|
28
|
+
if (!stmt) {
|
|
29
|
+
stmt = this.db.prepare(sql);
|
|
30
|
+
this.statementCache.set(sql, stmt);
|
|
31
|
+
}
|
|
32
|
+
return stmt;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Delete the current record from the database
|
|
36
|
+
* Returns the number of deleted records (0 or 1)
|
|
37
|
+
*/
|
|
38
|
+
delete() {
|
|
39
|
+
if (this._data === null) {
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
if (!this.primaryKey || !(this.primaryKey in this._data)) {
|
|
43
|
+
throw new Error(`Cannot delete: No primary key defined or primary key not found in record`);
|
|
44
|
+
}
|
|
45
|
+
const id = this._data[this.primaryKey];
|
|
46
|
+
const sql = `DELETE FROM "${this.tableName}" WHERE "${this.primaryKey}" = ?`;
|
|
47
|
+
const stmt = this.getStatement(sql);
|
|
48
|
+
const info = stmt.run(id);
|
|
49
|
+
return info.changes;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Update the current record in the database
|
|
53
|
+
* Returns the number of updated records (0 or 1)
|
|
54
|
+
*/
|
|
55
|
+
update(data) {
|
|
56
|
+
if (this._data === null) {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
if (!this.primaryKey || !(this.primaryKey in this._data)) {
|
|
60
|
+
throw new Error(`Cannot update: No primary key defined or primary key not found in record`);
|
|
61
|
+
}
|
|
62
|
+
const id = this._data[this.primaryKey];
|
|
63
|
+
const updateKeys = Object.keys(data);
|
|
64
|
+
const updateValues = Object.values(data);
|
|
65
|
+
const setClauses = updateKeys.map((k) => `"${k}" = ?`).join(', ');
|
|
66
|
+
const sql = `UPDATE "${this.tableName}" SET ${setClauses} WHERE "${this.primaryKey}" = ?`;
|
|
67
|
+
const stmt = this.getStatement(sql);
|
|
68
|
+
const info = stmt.run(...updateValues, id);
|
|
69
|
+
return info.changes;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Save changes made to the record back to the database
|
|
73
|
+
* (Re-inserts/updates the full record)
|
|
74
|
+
* Returns the number of affected records
|
|
75
|
+
*/
|
|
76
|
+
save() {
|
|
77
|
+
if (this._data === null) {
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
if (!this.primaryKey || !(this.primaryKey in this._data)) {
|
|
81
|
+
throw new Error(`Cannot save: No primary key defined or primary key not found in record`);
|
|
82
|
+
}
|
|
83
|
+
const id = this._data[this.primaryKey];
|
|
84
|
+
const updateKeys = Object.keys(this._data).filter((k) => k !== this.primaryKey);
|
|
85
|
+
const updateValues = updateKeys.map((k) => this._data[k]);
|
|
86
|
+
const setClauses = updateKeys.map((k) => `"${k}" = ?`).join(', ');
|
|
87
|
+
const sql = `UPDATE "${this.tableName}" SET ${setClauses} WHERE "${this.primaryKey}" = ?`;
|
|
88
|
+
const stmt = this.getStatement(sql);
|
|
89
|
+
const info = stmt.run(...updateValues, id);
|
|
90
|
+
return info.changes;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Refresh the record from the database
|
|
94
|
+
* Returns a new result with the refreshed data and chainable methods
|
|
95
|
+
*/
|
|
96
|
+
refresh() {
|
|
97
|
+
if (this._data === null || !this.primaryKey || !(this.primaryKey in this._data)) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const id = this._data[this.primaryKey];
|
|
101
|
+
const sql = `SELECT * FROM "${this.tableName}" WHERE "${this.primaryKey}" = ?`;
|
|
102
|
+
const stmt = this.getStatement(sql);
|
|
103
|
+
const data = stmt.get(id) || null;
|
|
104
|
+
return createResultProxy(this.db, this.tableName, this.statementCache, this.primaryKey, data);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if the record exists (is not null)
|
|
108
|
+
*/
|
|
109
|
+
exists() {
|
|
110
|
+
return this._data !== null;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get the underlying data
|
|
114
|
+
*/
|
|
115
|
+
toJSON() {
|
|
116
|
+
return this._data;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get the underlying data (alias for toJSON)
|
|
120
|
+
*/
|
|
121
|
+
getData() {
|
|
122
|
+
return this._data;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if the result is null
|
|
126
|
+
*/
|
|
127
|
+
isNull() {
|
|
128
|
+
return this._data === null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.ResultProxy = ResultProxy;
|
|
132
|
+
/**
|
|
133
|
+
* Create a ResultProxy that also acts as a Proxy for direct property access
|
|
134
|
+
* This allows: result.propertyName AND result.delete()
|
|
135
|
+
* Returns null when data is null to maintain backward compatibility
|
|
136
|
+
*/
|
|
137
|
+
function createResultProxy(db, tableName, statementCache, primaryKey, data) {
|
|
138
|
+
// Return null directly when data is null to maintain backward compatibility
|
|
139
|
+
if (data === null) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const proxy = new ResultProxy(db, tableName, statementCache, primaryKey, data);
|
|
143
|
+
// Type-safe way to access proxy properties
|
|
144
|
+
const proxyAsAny = proxy;
|
|
145
|
+
// For non-null results, create a proxy that combines data and methods
|
|
146
|
+
return new Proxy(data, {
|
|
147
|
+
get(target, prop) {
|
|
148
|
+
// First check if it's a method from ResultProxy
|
|
149
|
+
if (prop in proxy && typeof proxyAsAny[prop] === 'function') {
|
|
150
|
+
return proxyAsAny[prop].bind(proxy);
|
|
151
|
+
}
|
|
152
|
+
// Then check if it's a property from the data
|
|
153
|
+
if (prop in target) {
|
|
154
|
+
return target[prop];
|
|
155
|
+
}
|
|
156
|
+
return undefined;
|
|
157
|
+
},
|
|
158
|
+
set(target, prop, value) {
|
|
159
|
+
// Allow setting properties on the data
|
|
160
|
+
;
|
|
161
|
+
target[prop] = value;
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=result-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-proxy.js","sourceRoot":"","sources":["../src/result-proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BetterSQL Types - Core type definitions for BetterSQL ORM
|
|
3
|
+
*/
|
|
4
|
+
/** Supported SQLite column types */
|
|
5
|
+
export type ColumnType = 'INTEGER' | 'TEXT' | 'REAL' | 'BLOB' | 'NULL';
|
|
6
|
+
/** Column definition for schema */
|
|
7
|
+
export interface ColumnDefinition {
|
|
8
|
+
type: ColumnType;
|
|
9
|
+
primary?: boolean;
|
|
10
|
+
unique?: boolean;
|
|
11
|
+
notNull?: boolean;
|
|
12
|
+
default?: unknown;
|
|
13
|
+
autoIncrement?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Schema definition - maps column names to their definitions */
|
|
16
|
+
export type SchemaDefinition = Record<string, ColumnDefinition>;
|
|
17
|
+
/** Maps SQLite types to TypeScript types */
|
|
18
|
+
export type SQLiteToTS<T extends ColumnType> = T extends 'INTEGER' ? number : T extends 'TEXT' ? string : T extends 'REAL' ? number : T extends 'BLOB' ? Uint8Array : T extends 'NULL' ? null : never;
|
|
19
|
+
/** Infer TypeScript type from a column definition */
|
|
20
|
+
export type InferColumnType<T extends ColumnDefinition> = SQLiteToTS<T['type']>;
|
|
21
|
+
/** Infer TypeScript type from a schema definition */
|
|
22
|
+
export type InferSchemaType<T extends SchemaDefinition> = {
|
|
23
|
+
[K in keyof T]: InferColumnType<T[K]>;
|
|
24
|
+
};
|
|
25
|
+
/** BetterSQL configuration options */
|
|
26
|
+
export interface BetterSQLConfig {
|
|
27
|
+
/** Path to the SQLite database file or ":memory:" for in-memory database */
|
|
28
|
+
filename: string;
|
|
29
|
+
/** Enable WAL mode for better concurrent performance */
|
|
30
|
+
wal?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Comparison operators for WHERE clauses */
|
|
33
|
+
export type ComparisonOperator = '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE';
|
|
34
|
+
/** Advanced where value with operator */
|
|
35
|
+
export interface WhereOperator<V> {
|
|
36
|
+
$eq?: V;
|
|
37
|
+
$ne?: V;
|
|
38
|
+
$gt?: V;
|
|
39
|
+
$gte?: V;
|
|
40
|
+
$lt?: V;
|
|
41
|
+
$lte?: V;
|
|
42
|
+
$like?: string;
|
|
43
|
+
$notLike?: string;
|
|
44
|
+
$in?: V[];
|
|
45
|
+
$notIn?: V[];
|
|
46
|
+
$between?: [V, V];
|
|
47
|
+
$isNull?: boolean;
|
|
48
|
+
}
|
|
49
|
+
/** Where value - can be a simple value or an operator object */
|
|
50
|
+
export type WhereValue<V> = V | WhereOperator<V>;
|
|
51
|
+
/** Where clause conditions - supports simple equality or operator objects */
|
|
52
|
+
export type WhereCondition<T> = {
|
|
53
|
+
[K in keyof T]?: WhereValue<T[K]>;
|
|
54
|
+
};
|
|
55
|
+
/** OR condition wrapper */
|
|
56
|
+
export interface OrCondition<T> {
|
|
57
|
+
$or: WhereCondition<T>[];
|
|
58
|
+
}
|
|
59
|
+
/** AND condition wrapper */
|
|
60
|
+
export interface AndCondition<T> {
|
|
61
|
+
$and: WhereCondition<T>[];
|
|
62
|
+
}
|
|
63
|
+
/** Combined where condition that supports OR and AND */
|
|
64
|
+
export type AdvancedWhereCondition<T> = WhereCondition<T> | OrCondition<T> | AndCondition<T>;
|
|
65
|
+
/** Aggregate function types */
|
|
66
|
+
export type AggregateFunction = 'COUNT' | 'SUM' | 'AVG' | 'MIN' | 'MAX';
|
|
67
|
+
/** Order direction */
|
|
68
|
+
export type OrderDirection = 'ASC' | 'DESC';
|
|
69
|
+
/** Order by clause */
|
|
70
|
+
export type OrderBy<T> = {
|
|
71
|
+
column: keyof T;
|
|
72
|
+
direction?: OrderDirection;
|
|
73
|
+
};
|
|
74
|
+
/** Query options for find operations */
|
|
75
|
+
export interface QueryOptions<T> {
|
|
76
|
+
where?: WhereCondition<T>;
|
|
77
|
+
orderBy?: OrderBy<T> | OrderBy<T>[];
|
|
78
|
+
limit?: number;
|
|
79
|
+
offset?: number;
|
|
80
|
+
}
|
|
81
|
+
/** Update data type */
|
|
82
|
+
export type UpdateData<T> = Partial<T>;
|
|
83
|
+
/** Transaction callback type */
|
|
84
|
+
export type TransactionCallback<R> = () => R;
|
|
85
|
+
/** SQLite query parameter binding types */
|
|
86
|
+
export type SQLQueryBindings = string | number | bigint | boolean | null | Uint8Array;
|
|
87
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { ComparisonOperator, OrderDirection, SQLQueryBindings, UpdateData, WhereCondition } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* UpdateBuilder<T> - A fluent query builder for constructing UPDATE queries
|
|
5
|
+
* Queries are only executed when .run() is called
|
|
6
|
+
*/
|
|
7
|
+
export declare class UpdateBuilder<T> {
|
|
8
|
+
private db;
|
|
9
|
+
private tableName;
|
|
10
|
+
private _data;
|
|
11
|
+
private _where;
|
|
12
|
+
private _orConditions;
|
|
13
|
+
private _orderBy;
|
|
14
|
+
private _limit?;
|
|
15
|
+
private statementCache;
|
|
16
|
+
constructor(db: Database.Database, tableName: string, statementCache: Map<string, Database.Statement>, data: UpdateData<T>, initialWhere?: WhereCondition<T>);
|
|
17
|
+
/**
|
|
18
|
+
* Add WHERE conditions to the query (AND)
|
|
19
|
+
* @overload where(conditions) - Add conditions object
|
|
20
|
+
* @overload where(column, operator, value) - Add single condition with operator
|
|
21
|
+
*/
|
|
22
|
+
where(conditions: WhereCondition<T>): UpdateBuilder<T>;
|
|
23
|
+
where<K extends keyof T>(column: K, operator: ComparisonOperator, value: T[K]): UpdateBuilder<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Add OR conditions to the query
|
|
26
|
+
* @overload orWhere(conditions) - Add conditions object
|
|
27
|
+
* @overload orWhere(column, operator, value) - Add single condition with operator
|
|
28
|
+
*/
|
|
29
|
+
orWhere(conditions: WhereCondition<T>): UpdateBuilder<T>;
|
|
30
|
+
orWhere<K extends keyof T>(column: K, operator: ComparisonOperator, value: T[K]): UpdateBuilder<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Add ORDER BY clause to the query (SQLite supports ORDER BY in UPDATE with LIMIT)
|
|
33
|
+
*/
|
|
34
|
+
orderBy(column: keyof T, direction?: OrderDirection): UpdateBuilder<T>;
|
|
35
|
+
/**
|
|
36
|
+
* Set LIMIT for the query (SQLite supports LIMIT in UPDATE)
|
|
37
|
+
*/
|
|
38
|
+
limit(count: number): UpdateBuilder<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Build the SQL query and parameters
|
|
41
|
+
*/
|
|
42
|
+
private buildQuery;
|
|
43
|
+
/**
|
|
44
|
+
* Get or create a cached prepared statement
|
|
45
|
+
*/
|
|
46
|
+
private getStatement;
|
|
47
|
+
/**
|
|
48
|
+
* Execute the UPDATE query and return the number of updated records
|
|
49
|
+
*/
|
|
50
|
+
run(): number;
|
|
51
|
+
/**
|
|
52
|
+
* Get the SQL string for debugging
|
|
53
|
+
*/
|
|
54
|
+
toSQL(): {
|
|
55
|
+
sql: string;
|
|
56
|
+
params: SQLQueryBindings[];
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=update-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-builder.d.ts","sourceRoot":"","sources":["../src/update-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EACV,kBAAkB,EAElB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,SAAS,CAAA;AAGhB;;;GAGG;AACH,qBAAa,aAAa,CAAC,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,cAAc,CAAiC;gBAGrD,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC/C,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EACnB,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAWlC;;;;OAIG;IACH,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IACtD,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAiBhG;;;;OAIG;IACH,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAiBlG;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAE,cAAsB,GAAG,aAAa,CAAC,CAAC,CAAC;IAK7E;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;IAKtC;;OAEG;IACH,OAAO,CAAC,UAAU;IA6ClB;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,GAAG,IAAI,MAAM;IASb;;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.UpdateBuilder = void 0;
|
|
4
|
+
const where_builder_1 = require("./where-builder");
|
|
5
|
+
/**
|
|
6
|
+
* UpdateBuilder<T> - A fluent query builder for constructing UPDATE queries
|
|
7
|
+
* Queries are only executed when .run() is called
|
|
8
|
+
*/
|
|
9
|
+
class UpdateBuilder {
|
|
10
|
+
db;
|
|
11
|
+
tableName;
|
|
12
|
+
_data;
|
|
13
|
+
_where = {};
|
|
14
|
+
_orConditions = [];
|
|
15
|
+
_orderBy = [];
|
|
16
|
+
_limit;
|
|
17
|
+
statementCache;
|
|
18
|
+
constructor(db, tableName, statementCache, data, initialWhere) {
|
|
19
|
+
this.db = db;
|
|
20
|
+
this.tableName = tableName;
|
|
21
|
+
this.statementCache = statementCache;
|
|
22
|
+
this._data = data;
|
|
23
|
+
if (initialWhere) {
|
|
24
|
+
this._where = { ...initialWhere };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
where(conditionsOrColumn, operator, value) {
|
|
28
|
+
if (typeof conditionsOrColumn === 'string' && operator !== undefined && value !== undefined) {
|
|
29
|
+
// Called as where(column, operator, value)
|
|
30
|
+
const condition = (0, where_builder_1.operatorToCondition)(operator, value);
|
|
31
|
+
this._where = { ...this._where, [conditionsOrColumn]: condition };
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Called as where(conditions)
|
|
35
|
+
this._where = { ...this._where, ...conditionsOrColumn };
|
|
36
|
+
}
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
orWhere(conditionsOrColumn, operator, value) {
|
|
40
|
+
if (typeof conditionsOrColumn === 'string' && operator !== undefined && value !== undefined) {
|
|
41
|
+
// Called as orWhere(column, operator, value)
|
|
42
|
+
const condition = (0, where_builder_1.operatorToCondition)(operator, value);
|
|
43
|
+
this._orConditions.push({ [conditionsOrColumn]: condition });
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Called as orWhere(conditions)
|
|
47
|
+
this._orConditions.push(conditionsOrColumn);
|
|
48
|
+
}
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Add ORDER BY clause to the query (SQLite supports ORDER BY in UPDATE with LIMIT)
|
|
53
|
+
*/
|
|
54
|
+
orderBy(column, direction = 'ASC') {
|
|
55
|
+
this._orderBy.push({ column, direction });
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Set LIMIT for the query (SQLite supports LIMIT in UPDATE)
|
|
60
|
+
*/
|
|
61
|
+
limit(count) {
|
|
62
|
+
this._limit = count;
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build the SQL query and parameters
|
|
67
|
+
*/
|
|
68
|
+
buildQuery() {
|
|
69
|
+
const params = [];
|
|
70
|
+
// Build SET clause
|
|
71
|
+
const updateKeys = Object.keys(this._data);
|
|
72
|
+
const updateValues = Object.values(this._data);
|
|
73
|
+
const setClauses = updateKeys.map((k) => `"${k}" = ?`).join(', ');
|
|
74
|
+
params.push(...updateValues);
|
|
75
|
+
let sql = `UPDATE "${this.tableName}" SET ${setClauses}`;
|
|
76
|
+
// WHERE clause
|
|
77
|
+
const whereClause = (0, where_builder_1.buildWhereClause)(this._where, params);
|
|
78
|
+
const orClauses = this._orConditions.map((orCond) => {
|
|
79
|
+
const orParams = [];
|
|
80
|
+
const clause = (0, where_builder_1.buildWhereClause)(orCond, orParams);
|
|
81
|
+
params.push(...orParams);
|
|
82
|
+
return `(${clause})`;
|
|
83
|
+
});
|
|
84
|
+
if (whereClause || orClauses.length > 0) {
|
|
85
|
+
if (whereClause && orClauses.length > 0) {
|
|
86
|
+
// Combine AND conditions with OR conditions: (AND conditions) OR (OR condition 1) OR (OR condition 2)
|
|
87
|
+
sql += ` WHERE (${whereClause}) OR ${orClauses.join(' OR ')}`;
|
|
88
|
+
}
|
|
89
|
+
else if (orClauses.length > 0) {
|
|
90
|
+
sql += ` WHERE ${orClauses.join(' OR ')}`;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
sql += ` WHERE ${whereClause}`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ORDER BY clause (SQLite supports this with LIMIT)
|
|
97
|
+
if (this._orderBy.length > 0) {
|
|
98
|
+
const orderClauses = this._orderBy.map((o) => `"${String(o.column)}" ${o.direction || 'ASC'}`);
|
|
99
|
+
sql += ` ORDER BY ${orderClauses.join(', ')}`;
|
|
100
|
+
}
|
|
101
|
+
// LIMIT clause
|
|
102
|
+
if (this._limit !== undefined) {
|
|
103
|
+
sql += ` LIMIT ${this._limit}`;
|
|
104
|
+
}
|
|
105
|
+
return { sql, params };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get or create a cached prepared statement
|
|
109
|
+
*/
|
|
110
|
+
getStatement(sql) {
|
|
111
|
+
let stmt = this.statementCache.get(sql);
|
|
112
|
+
if (!stmt) {
|
|
113
|
+
stmt = this.db.prepare(sql);
|
|
114
|
+
this.statementCache.set(sql, stmt);
|
|
115
|
+
}
|
|
116
|
+
return stmt;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Execute the UPDATE query and return the number of updated records
|
|
120
|
+
*/
|
|
121
|
+
run() {
|
|
122
|
+
const { sql, params } = this.buildQuery();
|
|
123
|
+
const stmt = this.getStatement(sql);
|
|
124
|
+
const info = stmt.run(...params);
|
|
125
|
+
// Use the changes from stmt.run() return value (more efficient)
|
|
126
|
+
return info.changes;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get the SQL string for debugging
|
|
130
|
+
*/
|
|
131
|
+
toSQL() {
|
|
132
|
+
return this.buildQuery();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.UpdateBuilder = UpdateBuilder;
|
|
136
|
+
//# sourceMappingURL=update-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-builder.js","sourceRoot":"","sources":["../src/update-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ComparisonOperator, SQLQueryBindings, WhereCondition, WhereOperator } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Check if a value is a WhereOperator object
|
|
4
|
+
*/
|
|
5
|
+
export declare function isWhereOperator<V>(value: unknown): value is WhereOperator<V>;
|
|
6
|
+
/**
|
|
7
|
+
* Map comparison operator string to WhereOperator key
|
|
8
|
+
*/
|
|
9
|
+
export declare function operatorToCondition<V>(operator: ComparisonOperator, value: V): WhereOperator<V>;
|
|
10
|
+
/**
|
|
11
|
+
* Build conditions for a single key-value pair with operator support
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildCondition(key: string, value: unknown, params: SQLQueryBindings[]): string;
|
|
14
|
+
/**
|
|
15
|
+
* Build WHERE clause from conditions object
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildWhereClause<T>(where: WhereCondition<T>, params: SQLQueryBindings[]): string;
|
|
18
|
+
//# sourceMappingURL=where-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where-builder.d.ts","sourceRoot":"","sources":["../src/where-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEnG;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,CAI5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAsB/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CA+D9F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAShG"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isWhereOperator = isWhereOperator;
|
|
4
|
+
exports.operatorToCondition = operatorToCondition;
|
|
5
|
+
exports.buildCondition = buildCondition;
|
|
6
|
+
exports.buildWhereClause = buildWhereClause;
|
|
7
|
+
/**
|
|
8
|
+
* Check if a value is a WhereOperator object
|
|
9
|
+
*/
|
|
10
|
+
function isWhereOperator(value) {
|
|
11
|
+
if (value === null || typeof value !== "object")
|
|
12
|
+
return false;
|
|
13
|
+
const ops = ["$eq", "$ne", "$gt", "$gte", "$lt", "$lte", "$like", "$notLike", "$in", "$notIn", "$between", "$isNull"];
|
|
14
|
+
return ops.some(op => op in value);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Map comparison operator string to WhereOperator key
|
|
18
|
+
*/
|
|
19
|
+
function operatorToCondition(operator, value) {
|
|
20
|
+
switch (operator) {
|
|
21
|
+
case "=":
|
|
22
|
+
return { $eq: value };
|
|
23
|
+
case "!=":
|
|
24
|
+
case "<>":
|
|
25
|
+
return { $ne: value };
|
|
26
|
+
case ">":
|
|
27
|
+
return { $gt: value };
|
|
28
|
+
case ">=":
|
|
29
|
+
return { $gte: value };
|
|
30
|
+
case "<":
|
|
31
|
+
return { $lt: value };
|
|
32
|
+
case "<=":
|
|
33
|
+
return { $lte: value };
|
|
34
|
+
case "LIKE":
|
|
35
|
+
return { $like: value };
|
|
36
|
+
case "NOT LIKE":
|
|
37
|
+
return { $notLike: value };
|
|
38
|
+
default:
|
|
39
|
+
return { $eq: value };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build conditions for a single key-value pair with operator support
|
|
44
|
+
*/
|
|
45
|
+
function buildCondition(key, value, params) {
|
|
46
|
+
const column = `"${key}"`;
|
|
47
|
+
if (isWhereOperator(value)) {
|
|
48
|
+
const conditions = [];
|
|
49
|
+
const op = value;
|
|
50
|
+
if (op.$eq !== undefined) {
|
|
51
|
+
params.push(op.$eq);
|
|
52
|
+
conditions.push(`${column} = ?`);
|
|
53
|
+
}
|
|
54
|
+
if (op.$ne !== undefined) {
|
|
55
|
+
params.push(op.$ne);
|
|
56
|
+
conditions.push(`${column} != ?`);
|
|
57
|
+
}
|
|
58
|
+
if (op.$gt !== undefined) {
|
|
59
|
+
params.push(op.$gt);
|
|
60
|
+
conditions.push(`${column} > ?`);
|
|
61
|
+
}
|
|
62
|
+
if (op.$gte !== undefined) {
|
|
63
|
+
params.push(op.$gte);
|
|
64
|
+
conditions.push(`${column} >= ?`);
|
|
65
|
+
}
|
|
66
|
+
if (op.$lt !== undefined) {
|
|
67
|
+
params.push(op.$lt);
|
|
68
|
+
conditions.push(`${column} < ?`);
|
|
69
|
+
}
|
|
70
|
+
if (op.$lte !== undefined) {
|
|
71
|
+
params.push(op.$lte);
|
|
72
|
+
conditions.push(`${column} <= ?`);
|
|
73
|
+
}
|
|
74
|
+
if (op.$like !== undefined) {
|
|
75
|
+
params.push(op.$like);
|
|
76
|
+
conditions.push(`${column} LIKE ?`);
|
|
77
|
+
}
|
|
78
|
+
if (op.$notLike !== undefined) {
|
|
79
|
+
params.push(op.$notLike);
|
|
80
|
+
conditions.push(`${column} NOT LIKE ?`);
|
|
81
|
+
}
|
|
82
|
+
if (op.$in !== undefined && Array.isArray(op.$in)) {
|
|
83
|
+
const placeholders = op.$in.map(() => "?").join(", ");
|
|
84
|
+
params.push(...op.$in);
|
|
85
|
+
conditions.push(`${column} IN (${placeholders})`);
|
|
86
|
+
}
|
|
87
|
+
if (op.$notIn !== undefined && Array.isArray(op.$notIn)) {
|
|
88
|
+
const placeholders = op.$notIn.map(() => "?").join(", ");
|
|
89
|
+
params.push(...op.$notIn);
|
|
90
|
+
conditions.push(`${column} NOT IN (${placeholders})`);
|
|
91
|
+
}
|
|
92
|
+
if (op.$between !== undefined && Array.isArray(op.$between)) {
|
|
93
|
+
params.push(op.$between[0], op.$between[1]);
|
|
94
|
+
conditions.push(`${column} BETWEEN ? AND ?`);
|
|
95
|
+
}
|
|
96
|
+
if (op.$isNull !== undefined) {
|
|
97
|
+
conditions.push(op.$isNull ? `${column} IS NULL` : `${column} IS NOT NULL`);
|
|
98
|
+
}
|
|
99
|
+
return conditions.join(" AND ");
|
|
100
|
+
}
|
|
101
|
+
// Simple equality check
|
|
102
|
+
params.push(value);
|
|
103
|
+
return `${column} = ?`;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Build WHERE clause from conditions object
|
|
107
|
+
*/
|
|
108
|
+
function buildWhereClause(where, params) {
|
|
109
|
+
const whereKeys = Object.keys(where);
|
|
110
|
+
if (whereKeys.length === 0)
|
|
111
|
+
return "";
|
|
112
|
+
const conditions = whereKeys.map((key) => {
|
|
113
|
+
return buildCondition(String(key), where[key], params);
|
|
114
|
+
});
|
|
115
|
+
return conditions.join(" AND ");
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=where-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where-builder.js","sourceRoot":"","sources":["../src/where-builder.ts"],"names":[],"mappings":"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"}
|