@je-es/sdb 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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Maysara Elshewehy (https://github.com/maysara-elshewehy)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,283 @@
1
+ <!-- ╔══════════════════════════════ BEG ══════════════════════════════╗ -->
2
+
3
+ <br>
4
+ <div align="center">
5
+ <p>
6
+ <img src="./assets/img/logo.png" alt="logo" style="" height="80" />
7
+ </p>
8
+ </div>
9
+
10
+ <div align="center">
11
+ <img src="https://img.shields.io/badge/v-0.0.1-black"/>
12
+ <img src="https://img.shields.io/badge/🔥-@je--es-black"/>
13
+ <br>
14
+ <img src="https://github.com/je-es/sdb/actions/workflows/ci.yml/badge.svg" alt="CI" />
15
+ <img src="https://img.shields.io/badge/coverage-100%25-brightgreen" alt="Test Coverage" />
16
+ <img src="https://img.shields.io/github/issues/je-es/sdb?style=flat" alt="Github Repo Issues" />
17
+ <img src="https://img.shields.io/github/stars/je-es/sdb?style=social" alt="GitHub Repo stars" />
18
+ </div>
19
+ <br>
20
+
21
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
22
+
23
+
24
+
25
+ <!-- ╔══════════════════════════════ DOC ══════════════════════════════╗ -->
26
+
27
+ - ## Quick Start 🔥
28
+
29
+ > **A lightweight, type-safe SQLite database wrapper for Bun with an elegant API and zero dependencies.**
30
+
31
+ - #### Setup
32
+
33
+ > install [`space`](https://github.com/solution-lib/space) first.
34
+
35
+ ```bash
36
+ # install
37
+ space i @je-es/sdb
38
+ ```
39
+
40
+ ```ts
41
+ // import
42
+ import { DB, table, integer, text, primaryKey, notNull, unique } from '@je-es/sdb';
43
+ ```
44
+
45
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
46
+
47
+ - #### Usage
48
+
49
+ - ##### Initialize Database
50
+ ```ts
51
+ // In-memory database
52
+ const db = new DB();
53
+
54
+ // Or file-based database
55
+ const db = new DB('./my-database.db');
56
+ ```
57
+
58
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
59
+
60
+ - ##### Define Schema
61
+ ```ts
62
+ import { table, integer, text, real, primaryKey, notNull, unique, defaultValue } from '@je-es/sdb';
63
+
64
+ // Define table schema
65
+ const usersSchema = table('users', [
66
+ primaryKey(integer('id'), true), // auto-increment primary key
67
+ notNull(text('name')),
68
+ unique(text('email')),
69
+ integer('age'),
70
+ defaultValue(text('status'), 'active')
71
+ ]);
72
+
73
+ // Create the table
74
+ db.defineSchema(usersSchema);
75
+ ```
76
+
77
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
78
+
79
+ - ##### CRUD Operations
80
+ ```ts
81
+ // Insert
82
+ const user = db.insert('users', {
83
+ name: 'Alice',
84
+ email: 'alice@example.com',
85
+ age: 25
86
+ });
87
+
88
+ // Find by ID
89
+ const foundUser = db.findById('users', 1);
90
+
91
+ // Find one
92
+ const user = db.findOne('users', { email: 'alice@example.com' });
93
+
94
+ // Find many
95
+ const youngUsers = db.find('users', { status: 'active' });
96
+
97
+ // Get all
98
+ const allUsers = db.all('users');
99
+
100
+ // Update
101
+ db.update('users', 1, { age: 26 });
102
+
103
+ // Delete
104
+ db.delete('users', 1);
105
+ ```
106
+
107
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
108
+
109
+ - ##### Query Builder
110
+ ```ts
111
+ // Simple query
112
+ const results = db.query()
113
+ .select(['name', 'email'])
114
+ .from('users')
115
+ .where({ column: 'age', operator: '>', value: 21 })
116
+ .orderBy('name', 'ASC')
117
+ .limit(10)
118
+ .execute();
119
+
120
+ // Complex query with multiple conditions
121
+ const activeUsers = db.query()
122
+ .select()
123
+ .from('users')
124
+ .where({ column: 'status', operator: '=', value: 'active' })
125
+ .and({ column: 'age', operator: '>=', value: 18 })
126
+ .orderBy('name', 'ASC')
127
+ .execute();
128
+
129
+ // OR conditions
130
+ const users = db.query()
131
+ .select()
132
+ .from('users')
133
+ .where({ column: 'status', operator: '=', value: 'active' })
134
+ .or({ column: 'status', operator: '=', value: 'pending' })
135
+ .execute();
136
+
137
+ // IN operator
138
+ const specificUsers = db.query()
139
+ .select()
140
+ .from('users')
141
+ .where({ column: 'id', operator: 'IN', value: [1, 2, 3] })
142
+ .execute();
143
+
144
+ // LIKE operator
145
+ const searchResults = db.query()
146
+ .select()
147
+ .from('users')
148
+ .where({ column: 'name', operator: 'LIKE', value: 'A%' })
149
+ .execute();
150
+
151
+ // Pagination
152
+ const page2 = db.query()
153
+ .select()
154
+ .from('users')
155
+ .orderBy('id', 'ASC')
156
+ .limit(10)
157
+ .offset(10)
158
+ .execute();
159
+
160
+ // Get single result
161
+ const user = db.query()
162
+ .select()
163
+ .from('users')
164
+ .where({ column: 'email', operator: '=', value: 'test@example.com' })
165
+ .executeOne();
166
+ ```
167
+
168
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
169
+
170
+ - ##### Transactions
171
+ ```ts
172
+ db.transaction((txDb) => {
173
+ txDb.insert('users', { name: 'Alice', email: 'alice@example.com' });
174
+ txDb.insert('users', { name: 'Bob', email: 'bob@example.com' });
175
+ // Automatically commits if no error
176
+ // Automatically rolls back on error
177
+ });
178
+ ```
179
+
180
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
181
+
182
+ - ##### Raw SQL
183
+ ```ts
184
+ // Execute without return
185
+ db.exec('DELETE FROM users WHERE status = "inactive"');
186
+
187
+ // Execute with parameters and get results
188
+ const results = db.raw(
189
+ 'SELECT * FROM users WHERE age > ? AND status = ?',
190
+ [21, 'active']
191
+ );
192
+
193
+ // Get single result
194
+ const user = db.rawOne(
195
+ 'SELECT * FROM users WHERE email = ?',
196
+ ['test@example.com']
197
+ );
198
+ ```
199
+
200
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
201
+
202
+ - ##### Foreign Keys & Indexes
203
+ ```ts
204
+ import { references } from '@je-es/sdb';
205
+
206
+ // Table with foreign key
207
+ const postsSchema = table('posts', [
208
+ primaryKey(integer('id'), true),
209
+ notNull(text('title')),
210
+ text('content'),
211
+ references(integer('user_id'), 'users', 'id')
212
+ ]);
213
+
214
+ // Table with indexes
215
+ const productsSchema = {
216
+ name: 'products',
217
+ columns: [
218
+ { ...primaryKey(integer('id'), true) },
219
+ { ...text('name') },
220
+ { ...real('price') }
221
+ ],
222
+ indexes: [
223
+ { name: 'idx_name', columns: ['name'] },
224
+ { name: 'idx_price', columns: ['price'], unique: true }
225
+ ]
226
+ };
227
+
228
+ db.defineSchema(postsSchema);
229
+ db.defineSchema(productsSchema);
230
+ ```
231
+
232
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
233
+
234
+ - ##### Schema Management
235
+ ```ts
236
+ // Get table schema
237
+ const schema = db.getSchema('users');
238
+
239
+ // List all tables
240
+ const tables = db.listTables();
241
+
242
+ // Drop table
243
+ db.dropTable('old_table');
244
+
245
+ // Close database connection
246
+ db.close();
247
+ ```
248
+
249
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
250
+
251
+ - ##### Types
252
+
253
+ - ###### Column Types
254
+
255
+ - `integer(name)` - INTEGER column
256
+ - `text(name)` - TEXT column
257
+ - `real(name)` - REAL column (floating point)
258
+ - `blob(name)` - BLOB column (binary data)
259
+ - `numeric(name)` - NUMERIC column
260
+
261
+ - ###### Column Modifiers
262
+
263
+ - `primaryKey(col, autoIncrement?)` - Mark as primary key
264
+ - `notNull(col)` - Add NOT NULL constraint
265
+ - `unique(col)` - Add UNIQUE constraint
266
+ - `defaultValue(col, value)` - Set default value
267
+ - `references(col, table, column)` - Add foreign key constraint
268
+
269
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
270
+
271
+
272
+
273
+ <!-- ╔══════════════════════════════ END ══════════════════════════════╗ -->
274
+
275
+ <br>
276
+
277
+ ---
278
+
279
+ <div align="center">
280
+ <a href="https://github.com/solution-lib/space"><img src="https://img.shields.io/badge/by-Space-black"/></a>
281
+ </div>
282
+
283
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
package/dist/main.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var bun_sqlite=require('bun:sqlite');var o=class{constructor(t=":memory:"){this.currentQuery="";this.currentParams=[];this.schemas=new Map,this.db=new bun_sqlite.Database(t),this.db.exec("PRAGMA foreign_keys = ON");}close(){this.db.close();}defineSchema(t){this.schemas.set(t.name,t);let r=this.generateCreateTableSQL(t);if(this.db.exec(r),t.indexes)for(let e of t.indexes){let u=`CREATE ${e.unique?"UNIQUE":""} INDEX IF NOT EXISTS ${e.name} ON ${t.name} (${e.columns.join(", ")})`;this.db.exec(u);}}getSchema(t){return this.schemas.get(t)}listTables(){return this.db.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all().map(r=>r.name)}dropTable(t){this.db.exec(`DROP TABLE IF EXISTS ${t}`),this.schemas.delete(t);}query(){return this.reset(),this.createQueryBuilder()}find(t,r){let e=Object.entries(r).map(([s,u])=>({column:s,operator:"=",value:u}));return this.query().select().from(t).where(e).execute()}findOne(t,r){return this.query().select().from(t).where(Object.entries(r).map(([e,s])=>({column:e,operator:"=",value:s}))).limit(1).executeOne()}findById(t,r){return this.findOne(t,{id:r})}all(t){return this.query().select().from(t).execute()}insert(t,r){this.query().insert(t,r).execute();let e=this.db.query("SELECT last_insert_rowid() as id").get();return this.findById(t,e.id)}update(t,r,e){return this.query().update(t,e).where({column:"id",operator:"=",value:r}).execute(),this.findById(t,r)}delete(t,r){return this.query().delete(t).where({column:"id",operator:"=",value:r}).execute(),true}transaction(t){this.db.exec("BEGIN TRANSACTION");try{t(this),this.db.exec("COMMIT");}catch(r){throw this.db.exec("ROLLBACK"),r}}exec(t){this.db.exec(t);}raw(t,r=[]){return this.db.query(t).all(...r)}rawOne(t,r=[]){return this.db.query(t).get(...r)}reset(){this.currentQuery="",this.currentParams=[];}createQueryBuilder(){let t={_select:["*"],_from:"",_where:[],_orderBy:"",_limit:null,_offset:null,_isInsert:false,_isUpdate:false,_isDelete:false,_insertData:null,_updateData:null},r=this;return t.select=function(e){return this._select=e||["*"],this},t.from=function(e){return this._from=e,this},t.where=function(e){let u=(Array.isArray(e)?e:[e]).map(n=>{if(n.operator==="IS NULL"||n.operator==="IS NOT NULL")return `${n.column} ${n.operator}`;if(n.operator==="IN"&&Array.isArray(n.value)){let l=n.value.map(()=>"?").join(", ");return n.value.forEach(a=>{r.currentParams.push(a);}),`${n.column} IN (${l})`}else return r.currentParams.push(n.value),`${n.column} ${n.operator} ?`});return this._where.push(...u),this},t.and=function(e){return this.where(e)},t.or=function(e){let s="";if(e.operator==="IS NULL"||e.operator==="IS NOT NULL")s=`${e.column} ${e.operator}`;else if(e.operator==="IN"&&Array.isArray(e.value)){let u=e.value.map(()=>"?").join(", ");e.value.forEach(n=>{r.currentParams.push(n);}),s=`${e.column} IN (${u})`;}else r.currentParams.push(e.value),s=`${e.column} ${e.operator} ?`;return this._where.push(`OR ${s}`),this},t.orderBy=function(e,s="ASC"){return this._orderBy=`ORDER BY ${e} ${s}`,this},t.limit=function(e){return this._limit=e,this},t.offset=function(e){return this._offset=e,this},t.insert=function(e,s){return this._isInsert=true,this._from=e,this._insertData=s,this},t.update=function(e,s){return this._isUpdate=true,this._from=e,this._updateData=s,this},t.delete=function(e){return this._isDelete=true,this._from=e,this},t.raw=function(e,s=[]){return r.currentQuery=e,r.currentParams=s,this},t.execute=function(){let e="";if(this._isInsert&&this._insertData){let n=Object.keys(this._insertData),l=Object.values(this._insertData);if(n.length===0)e=`INSERT INTO ${this._from} DEFAULT VALUES`,r.currentParams=[];else {let a=n.map(()=>"?").join(", ");e=`INSERT INTO ${this._from} (${n.join(", ")}) VALUES (${a})`,r.currentParams=l;}}else if(this._isUpdate&&this._updateData){let n=Object.keys(this._updateData).map(a=>`${a} = ?`),l=Object.values(this._updateData);if(r.currentParams=[...l,...r.currentParams],e=`UPDATE ${this._from} SET ${n.join(", ")}`,this._where.length>0){let a=this.buildWhereClause();e+=` WHERE ${a}`;}}else if(this._isDelete){if(e=`DELETE FROM ${this._from}`,this._where.length>0){let n=this.buildWhereClause();e+=` WHERE ${n}`;}}else if(r.currentQuery)e=r.currentQuery;else {if(e=`SELECT ${this._select.join(", ")} FROM ${this._from}`,this._where.length>0){let n=this.buildWhereClause();e+=` WHERE ${n}`;}this._orderBy&&(e+=` ${this._orderBy}`),this._limit!==null&&(e+=` LIMIT ${this._limit}`),this._offset!==null&&(this._limit===null&&(e+=" LIMIT -1"),e+=` OFFSET ${this._offset}`);}let u=r.db.query(e).all(...r.currentParams);return r.reset(),u},t.buildWhereClause=function(){let e=[];for(let s=0;s<this._where.length;s++){let u=this._where[s];u.startsWith("OR ")?(e.push("OR"),e.push(u.substring(3))):(s>0&&!this._where[s-1].startsWith("OR ")&&e.push("AND"),e.push(u));}return e.join(" ")},t.executeOne=function(){let e=this.execute();return e.length>0?e[0]:null},t.executeRaw=function(e,s=[]){return r.db.query(e).all(...s)},t}generateCreateTableSQL(t){let r=t.columns.map(e=>{let s=`${e.name} ${e.type}`;return e.primaryKey&&(s+=" PRIMARY KEY",e.autoIncrement&&(s+=" AUTOINCREMENT")),e.notNull&&!e.primaryKey&&(s+=" NOT NULL"),e.unique&&(s+=" UNIQUE"),e.default!==void 0&&(typeof e.default=="string"?s+=` DEFAULT '${e.default}'`:e.default===null?s+=" DEFAULT NULL":s+=` DEFAULT ${e.default}`),e.references&&(s+=` REFERENCES ${e.references.table}(${e.references.column})`),s});return `CREATE TABLE IF NOT EXISTS ${t.name} (${r.join(", ")})`}};function h(i,t){return {name:i,columns:t}}function f(i,t){return {name:i,type:t}}function c(i){return {name:i,type:"INTEGER"}}function m(i){return {name:i,type:"TEXT"}}function d(i){return {name:i,type:"REAL"}}function g(i){return {name:i,type:"BLOB"}}function _(i){return {name:i,type:"NUMERIC"}}function E(i,t=false){return {...i,primaryKey:true,autoIncrement:t}}function w(i){return {...i,notNull:true}}function S(i){return {...i,unique:true}}function b(i,t){return {...i,default:t}}function C(i,t,r){return {...i,references:{table:t,column:r}}}exports.DB=o;exports.blob=g;exports.column=f;exports.defaultValue=b;exports.integer=c;exports.notNull=w;exports.numeric=_;exports.primaryKey=E;exports.real=d;exports.references=C;exports.table=h;exports.text=m;exports.unique=S;//# sourceMappingURL=main.cjs.map
2
+ //# sourceMappingURL=main.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main.ts"],"names":["DB","path","Database","schema","sql","index","indexSql","tableName","table","conditions","whereConditions","column","value","id","data","lastId","callback","error","params","builder","self","columns","condition","whereClauses","cond","placeholders","val","clause","direction","count","values","setClauses","col","updateValues","whereClause","result","parts","i","results","columnDefs","def","name","type","integer","text","real","blob","numeric","primaryKey","autoIncrement","notNull","unique","defaultValue","references"],"mappings":"kDAkBW,IAAMA,CAAAA,CAAN,KAAS,CAcR,WAAA,CAAYC,CAAAA,CAAe,UAAA,CAAY,CARvC,IAAA,CAAQ,YAAA,CAA2B,GACnC,IAAA,CAAQ,aAAA,CAAqC,EAAC,CAQ1C,IAAA,CAAK,OAAA,CAAU,IAAI,IACnB,IAAA,CAAK,EAAA,CAAK,IAAIC,mBAAAA,CAASD,CAAI,CAAA,CAC3B,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,0BAA0B,EAC3C,CAEA,OAAc,CACV,IAAA,CAAK,GAAG,KAAA,GACZ,CAGA,YAAA,CAAaE,EAAiC,CAC1C,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAIA,EAAO,IAAA,CAAMA,CAAM,CAAA,CACpC,IAAMC,EAAM,IAAA,CAAK,sBAAA,CAAuBD,CAAM,CAAA,CAI9C,GAHA,KAAK,EAAA,CAAG,IAAA,CAAKC,CAAG,CAAA,CAGZD,EAAO,OAAA,CACP,IAAA,IAAWE,CAAAA,IAASF,CAAAA,CAAO,QAAS,CAEhC,IAAMG,CAAAA,CAAW,CAAA,OAAA,EADCD,EAAM,MAAA,CAAS,QAAA,CAAW,EACR,CAAA,qBAAA,EAAwBA,CAAAA,CAAM,IAAI,CAAA,IAAA,EAAOF,CAAAA,CAAO,IAAI,CAAA,EAAA,EAAKE,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,IACrH,IAAA,CAAK,EAAA,CAAG,IAAA,CAAKC,CAAQ,EACzB,CAER,CAEA,UAAUC,CAAAA,CAAkD,CACxD,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAIA,CAAS,CACrC,CAEA,UAAA,EAAuB,CAEnB,OADe,KAAK,EAAA,CAAG,KAAA,CAAM,gFAAgF,CAAA,CAAE,KAAI,CACrG,GAAA,CAAK,GAAgB,CAAA,CAAqB,IAAI,CAChE,CAEA,SAAA,CAAUA,CAAAA,CAAyB,CAC/B,KAAK,EAAA,CAAG,IAAA,CAAK,CAAA,qBAAA,EAAwBA,CAAS,EAAE,CAAA,CAChD,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAOA,CAAS,EACjC,CAGA,OAA4B,CACxB,OAAA,IAAA,CAAK,OAAM,CACJ,IAAA,CAAK,kBAAA,EAChB,CAGA,IAAA,CAAKC,CAAAA,CAAeC,EAAuD,CACvE,IAAMC,EAA0C,MAAA,CAAO,OAAA,CAAQD,CAAU,CAAA,CAAE,IAAI,CAAC,CAACE,EAAQC,CAAK,CAAA,IAAO,CACjG,MAAA,CAAAD,CAAAA,CACA,QAAA,CAAU,GAAA,CACV,MAAAC,CACJ,CAAA,CAAE,CAAA,CAEF,OAAO,KAAK,KAAA,EAAM,CACb,MAAA,EAAO,CACP,KAAKJ,CAAK,CAAA,CACV,MAAME,CAAe,CAAA,CACrB,SACT,CAEA,OAAA,CAAQF,CAAAA,CAAeC,EAA4D,CAC/E,OAAO,IAAA,CAAK,KAAA,GACP,MAAA,EAAO,CACP,IAAA,CAAKD,CAAK,EACV,KAAA,CAAM,MAAA,CAAO,QAAQC,CAAU,CAAA,CAAE,IAAI,CAAC,CAACE,CAAAA,CAAQC,CAAK,KAAO,CACxD,MAAA,CAAAD,CAAAA,CACA,QAAA,CAAU,IACV,KAAA,CAAAC,CACJ,CAAA,CAAE,CAAC,EACF,KAAA,CAAM,CAAC,EACP,UAAA,EACT,CAEA,QAAA,CAASJ,CAAAA,CAAeK,CAAAA,CAAqC,CACzD,OAAO,IAAA,CAAK,OAAA,CAAQL,EAAO,CAAE,EAAA,CAAAK,CAAG,CAAC,CACrC,CAEA,GAAA,CAAIL,EAA0B,CAC1B,OAAO,KAAK,KAAA,EAAM,CAAE,QAAO,CAAE,IAAA,CAAKA,CAAK,CAAA,CAAE,SAC7C,CAEA,MAAA,CAAOA,CAAAA,CAAeM,EAA+C,CACjE,IAAA,CAAK,KAAA,EAAM,CAAE,OAAON,CAAAA,CAAOM,CAAI,EAAE,OAAA,EAAQ,CAGzC,IAAMC,CAAAA,CAAS,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,kCAAkC,CAAA,CAAE,GAAA,EAAI,CACrE,OAAO,KAAK,QAAA,CAASP,CAAAA,CAAOO,CAAAA,CAAO,EAAE,CACzC,CAEA,MAAA,CAAOP,EAAeK,CAAAA,CAAqBC,CAAAA,CAAsD,CAC7F,OAAA,IAAA,CAAK,KAAA,EAAM,CACN,MAAA,CAAON,EAAOM,CAAI,CAAA,CAClB,KAAA,CAAM,CAAE,OAAQ,IAAA,CAAM,QAAA,CAAU,GAAA,CAAK,KAAA,CAAOD,CAAG,CAAC,CAAA,CAChD,SAAQ,CAEN,IAAA,CAAK,SAASL,CAAAA,CAAOK,CAAE,CAClC,CAEA,OAAOL,CAAAA,CAAeK,CAAAA,CAA8B,CAChD,OAAA,IAAA,CAAK,KAAA,GACA,MAAA,CAAOL,CAAK,CAAA,CACZ,KAAA,CAAM,CAAE,MAAA,CAAQ,IAAA,CAAM,SAAU,GAAA,CAAK,KAAA,CAAOK,CAAG,CAAC,CAAA,CAChD,OAAA,EAAQ,CAEN,IACX,CAGA,WAAA,CAAYG,CAAAA,CAAkC,CAC1C,KAAK,EAAA,CAAG,IAAA,CAAK,mBAAmB,CAAA,CAChC,GAAI,CACAA,CAAAA,CAAS,IAAI,CAAA,CACb,IAAA,CAAK,GAAG,IAAA,CAAK,QAAQ,EACzB,CAAA,MAASC,EAAO,CACZ,MAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,UAAU,CAAA,CACjBA,CACV,CACJ,CAGA,KAAKb,CAAAA,CAAmB,CACpB,KAAK,EAAA,CAAG,IAAA,CAAKA,CAAG,EACpB,CAEA,GAAA,CAAIA,CAAAA,CAAac,EAA2B,EAAC,CAAc,CAEvD,OADa,KAAK,EAAA,CAAG,KAAA,CAAMd,CAAG,CAAA,CAClB,IAAI,GAAGc,CAAM,CAC7B,CAEA,MAAA,CAAOd,EAAac,CAAAA,CAA2B,EAAC,CAAmB,CAE/D,OADa,IAAA,CAAK,EAAA,CAAG,KAAA,CAAMd,CAAG,EAClB,GAAA,CAAI,GAAGc,CAAM,CAC7B,CAOQ,KAAA,EAAc,CAClB,KAAK,YAAA,CAAe,EAAA,CACpB,KAAK,aAAA,CAAgB,GACzB,CAEQ,oBAAyC,CAC7C,IAAMC,CAAAA,CAA0G,CAC5G,QAAS,CAAC,GAAG,CAAA,CACb,KAAA,CAAO,GACP,MAAA,CAAQ,GACR,QAAA,CAAU,EAAA,CACV,OAAQ,IAAA,CACR,OAAA,CAAS,IAAA,CACT,SAAA,CAAW,MACX,SAAA,CAAW,KAAA,CACX,SAAA,CAAW,KAAA,CACX,YAAa,IAAA,CACb,WAAA,CAAa,IACjB,CAAA,CAIMC,EAAO,IAAA,CAEb,OAAAD,EAAQ,MAAA,CAAS,SAASE,EAAwC,CAC9D,OAAA,IAAA,CAAK,OAAA,CAAUA,CAAAA,EAAW,CAAC,GAAG,CAAA,CACvB,IACX,CAAA,CAEAF,EAAQ,IAAA,CAAO,SAASX,CAAAA,CAAmC,CACvD,YAAK,KAAA,CAAQA,CAAAA,CACN,IACX,CAAA,CAEAW,CAAAA,CAAQ,MAAQ,SAASG,CAAAA,CAA8E,CAGnG,IAAMC,GAFa,KAAA,CAAM,OAAA,CAAQD,CAAS,CAAA,CAAIA,CAAAA,CAAY,CAACA,CAAS,CAAA,EAEpC,GAAA,CAAIE,CAAAA,EAAQ,CACxC,GAAIA,CAAAA,CAAK,WAAa,SAAA,EAAaA,CAAAA,CAAK,WAAa,aAAA,CACjD,OAAO,CAAA,EAAGA,CAAAA,CAAK,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAK,QAAQ,CAAA,CAAA,CACnC,GAAIA,CAAAA,CAAK,QAAA,GAAa,IAAA,EAAQ,KAAA,CAAM,QAAQA,CAAAA,CAAK,KAAK,EAAG,CAC5D,IAAMC,EAAeD,CAAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAExD,OAAAA,CAAAA,CAAK,KAAA,CAAM,OAAA,CAAQE,CAAAA,EAAO,CACtBN,CAAAA,CAAK,aAAA,CAAc,KAAKM,CAAqB,EACjD,CAAC,CAAA,CACM,CAAA,EAAGF,CAAAA,CAAK,MAAM,QAAQC,CAAY,CAAA,CAAA,CAC7C,CAAA,KACI,OAAAL,EAAK,aAAA,CAAc,IAAA,CAAKI,CAAAA,CAAK,KAAuB,EAC7C,CAAA,EAAGA,CAAAA,CAAK,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAK,QAAQ,CAAA,EAAA,CAE9C,CAAC,CAAA,CAED,OAAA,IAAA,CAAK,OAAO,IAAA,CAAK,GAAGD,CAAY,CAAA,CACzB,IACX,EAEAJ,CAAAA,CAAQ,GAAA,CAAM,SAASG,CAAAA,CAAqD,CACxE,OAAO,IAAA,CAAK,MAAOA,CAAS,CAChC,EAEAH,CAAAA,CAAQ,EAAA,CAAK,SAASG,CAAAA,CAAqD,CACvE,IAAIK,CAAAA,CAAS,EAAA,CACb,GAAIL,EAAU,QAAA,GAAa,SAAA,EAAaA,CAAAA,CAAU,QAAA,GAAa,cAC3DK,CAAAA,CAAS,CAAA,EAAGL,EAAU,MAAM,CAAA,CAAA,EAAIA,EAAU,QAAQ,CAAA,CAAA,CAAA,KAAA,GAC3CA,CAAAA,CAAU,QAAA,GAAa,MAAQ,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAU,KAAK,EAAG,CACtE,IAAMG,CAAAA,CAAeH,CAAAA,CAAU,MAAM,GAAA,CAAI,IAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAE7DA,CAAAA,CAAU,KAAA,CAAM,OAAA,CAAQI,GAAO,CAC3BN,CAAAA,CAAK,aAAA,CAAc,IAAA,CAAKM,CAAqB,EACjD,CAAC,CAAA,CACDC,CAAAA,CAAS,GAAGL,CAAAA,CAAU,MAAM,QAAQG,CAAY,CAAA,CAAA,EACpD,MACIL,CAAAA,CAAK,aAAA,CAAc,IAAA,CAAKE,CAAAA,CAAU,KAAuB,CAAA,CACzDK,CAAAA,CAAS,GAAGL,CAAAA,CAAU,MAAM,IAAIA,CAAAA,CAAU,QAAQ,CAAA,EAAA,CAAA,CAItD,OAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,GAAA,EAAMK,CAAM,CAAA,CAAE,CAAA,CACxB,IACX,CAAA,CAEAR,CAAAA,CAAQ,OAAA,CAAU,SAASR,EAAgBiB,CAAAA,CAA4B,KAAA,CAA2B,CAC9F,OAAA,IAAA,CAAK,SAAW,CAAA,SAAA,EAAYjB,CAAM,CAAA,CAAA,EAAIiB,CAAS,GACxC,IACX,CAAA,CAEAT,EAAQ,KAAA,CAAQ,SAASU,EAAmC,CACxD,OAAA,IAAA,CAAK,MAAA,CAASA,CAAAA,CACP,IACX,CAAA,CAEAV,CAAAA,CAAQ,MAAA,CAAS,SAASU,EAAmC,CACzD,OAAA,IAAA,CAAK,OAAA,CAAUA,CAAAA,CACR,IACX,CAAA,CAEAV,CAAAA,CAAQ,OAAS,SAASX,CAAAA,CAAeM,EAA0D,CAC/F,OAAA,IAAA,CAAK,SAAA,CAAY,IAAA,CACjB,KAAK,KAAA,CAAQN,CAAAA,CACb,IAAA,CAAK,WAAA,CAAcM,EACZ,IACX,CAAA,CAEAK,CAAAA,CAAQ,MAAA,CAAS,SAASX,CAAAA,CAAeM,CAAAA,CAA0D,CAC/F,OAAA,IAAA,CAAK,SAAA,CAAY,KACjB,IAAA,CAAK,KAAA,CAAQN,CAAAA,CACb,IAAA,CAAK,YAAcM,CAAAA,CACZ,IACX,CAAA,CAEAK,CAAAA,CAAQ,OAAS,SAASX,CAAAA,CAAmC,CACzD,OAAA,IAAA,CAAK,UAAY,IAAA,CACjB,IAAA,CAAK,MAAQA,CAAAA,CACN,IACX,EAEAW,CAAAA,CAAQ,GAAA,CAAM,SAASf,CAAAA,CAAac,EAA2B,EAAC,CAAuB,CACnF,OAAAE,EAAK,YAAA,CAAehB,CAAAA,CACpBgB,CAAAA,CAAK,aAAA,CAAgBF,EACd,IACX,CAAA,CAEAC,EAAQ,OAAA,CAAU,UAAsB,CACpC,IAAIf,CAAAA,CAAM,EAAA,CAEV,GAAI,KAAK,SAAA,EAAa,IAAA,CAAK,WAAA,CAAa,CACpC,IAAMiB,CAAAA,CAAU,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,CACtCS,CAAAA,CAAS,OAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAG7C,GAAIT,CAAAA,CAAQ,MAAA,GAAW,EACnBjB,CAAAA,CAAM,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,kBAC/BgB,CAAAA,CAAK,aAAA,CAAgB,EAAC,CAAA,KACnB,CACH,IAAMK,CAAAA,CAAeJ,EAAQ,GAAA,CAAI,IAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CACrDjB,EAAM,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,EAAA,EAAKiB,CAAAA,CAAQ,KAAK,IAAI,CAAC,CAAA,UAAA,EAAaI,CAAY,IAC/EL,CAAAA,CAAK,aAAA,CAAgBU,EACzB,CACJ,CAAA,KAAA,GAAW,KAAK,SAAA,EAAa,IAAA,CAAK,WAAA,CAAa,CAC3C,IAAMC,CAAAA,CAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,CAAE,GAAA,CAAIC,CAAAA,EAAO,CAAA,EAAGA,CAAG,CAAA,IAAA,CAAM,CAAA,CAClEC,EAAe,MAAA,CAAO,MAAA,CAAO,KAAK,WAAW,CAAA,CAInD,GAHAb,CAAAA,CAAK,cAAgB,CAAC,GAAGa,CAAAA,CAAc,GAAGb,EAAK,aAAa,CAAA,CAC5DhB,CAAAA,CAAM,CAAA,OAAA,EAAU,KAAK,KAAK,CAAA,KAAA,EAAQ2B,EAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAEnD,IAAA,CAAK,MAAA,CAAO,MAAA,CAAS,EAAG,CAExB,IAAMG,CAAAA,CAAc,IAAA,CAAK,kBAAkB,CAC3C9B,CAAAA,EAAO,CAAA,OAAA,EAAU8B,CAAW,GAChC,CACJ,CAAA,KAAA,GAAW,KAAK,SAAA,CAAA,CAGZ,GAFA9B,EAAM,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,CAAA,CAE3B,KAAK,MAAA,CAAO,MAAA,CAAS,EAAG,CAExB,IAAM8B,EAAc,IAAA,CAAK,gBAAA,EAAkB,CAC3C9B,CAAAA,EAAO,UAAU8B,CAAW,CAAA,EAChC,UAGId,CAAAA,CAAK,YAAA,CACLhB,EAAMgB,CAAAA,CAAK,YAAA,CAAA,KACR,CAGH,GAFAhB,EAAM,CAAA,OAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,GAEtD,IAAA,CAAK,MAAA,CAAO,OAAS,CAAA,CAAG,CAExB,IAAM8B,CAAAA,CAAc,IAAA,CAAK,gBAAA,EAAkB,CAC3C9B,GAAO,CAAA,OAAA,EAAU8B,CAAW,CAAA,EAChC,CAEI,KAAK,QAAA,GACL9B,CAAAA,EAAO,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA,CAAA,CAGxB,IAAA,CAAK,SAAW,IAAA,GAChBA,CAAAA,EAAO,UAAU,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA,CAI5B,IAAA,CAAK,UAAY,IAAA,GACb,IAAA,CAAK,MAAA,GAAW,IAAA,GAEhBA,GAAO,WAAA,CAAA,CAEXA,CAAAA,EAAO,CAAA,QAAA,EAAW,IAAA,CAAK,OAAO,CAAA,CAAA,EAEtC,CAIJ,IAAM+B,CAAAA,CADOf,CAAAA,CAAK,GAAG,KAAA,CAAMhB,CAAG,CAAA,CACV,GAAA,CAAI,GAAGgB,CAAAA,CAAK,aAAa,EAC7C,OAAAA,CAAAA,CAAK,OAAM,CACJe,CACX,CAAA,CAEAhB,CAAAA,CAAQ,iBAAmB,UAAmB,CAC1C,IAAMiB,CAAAA,CAAkB,GACxB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,KAAK,MAAA,CAAO,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CACzC,IAAMV,CAAAA,CAAS,IAAA,CAAK,MAAA,CAAOU,CAAC,EACxBV,CAAAA,CAAO,UAAA,CAAW,KAAK,CAAA,EACvBS,CAAAA,CAAM,KAAK,IAAI,CAAA,CACfA,CAAAA,CAAM,IAAA,CAAKT,EAAO,SAAA,CAAU,CAAC,CAAC,CAAA,GAE1BU,EAAI,CAAA,EAAK,CAAC,IAAA,CAAK,MAAA,CAAOA,EAAI,CAAC,CAAA,CAAE,WAAW,KAAK,CAAA,EAC7CD,EAAM,IAAA,CAAK,KAAK,CAAA,CAEpBA,CAAAA,CAAM,KAAKT,CAAM,CAAA,EAEzB,CACA,OAAOS,EAAM,IAAA,CAAK,GAAG,CACzB,CAAA,CAEAjB,EAAQ,UAAA,CAAa,UAA2B,CAC5C,IAAMmB,CAAAA,CAAU,KAAK,OAAA,EAAS,CAC9B,OAAOA,CAAAA,CAAQ,OAAS,CAAA,CAAIA,CAAAA,CAAQ,CAAC,CAAA,CAAI,IAC7C,CAAA,CAEAnB,CAAAA,CAAQ,UAAA,CAAa,SAASf,EAAac,CAAAA,CAA2B,GAAe,CAGjF,OAFaE,EAAK,EAAA,CAAG,KAAA,CAAMhB,CAAG,CAAA,CACV,IAAI,GAAGc,CAAM,CAErC,CAAA,CAEOC,CACX,CAEQ,sBAAA,CAAuBhB,CAAAA,CAAmC,CAC9D,IAAMoC,CAAAA,CAAapC,CAAAA,CAAO,QAAQ,GAAA,CAAI6B,CAAAA,EAAO,CACzC,IAAIQ,CAAAA,CAAM,CAAA,EAAGR,CAAAA,CAAI,IAAI,CAAA,CAAA,EAAIA,CAAAA,CAAI,IAAI,CAAA,CAAA,CAEjC,OAAIA,CAAAA,CAAI,UAAA,GACJQ,CAAAA,EAAO,cAAA,CACHR,EAAI,aAAA,GACJQ,CAAAA,EAAO,mBAIXR,CAAAA,CAAI,OAAA,EAAW,CAACA,CAAAA,CAAI,UAAA,GACpBQ,CAAAA,EAAO,WAAA,CAAA,CAGPR,EAAI,MAAA,GACJQ,CAAAA,EAAO,SAAA,CAAA,CAGPR,CAAAA,CAAI,UAAY,MAAA,GACZ,OAAOA,CAAAA,CAAI,OAAA,EAAY,SACvBQ,CAAAA,EAAO,CAAA,UAAA,EAAaR,EAAI,OAAO,CAAA,CAAA,CAAA,CACxBA,EAAI,OAAA,GAAY,IAAA,CACvBQ,CAAAA,EAAO,eAAA,CAEPA,GAAO,CAAA,SAAA,EAAYR,CAAAA,CAAI,OAAO,CAAA,CAAA,CAAA,CAIlCA,CAAAA,CAAI,aACJQ,CAAAA,EAAO,CAAA,YAAA,EAAeR,CAAAA,CAAI,UAAA,CAAW,KAAK,CAAA,CAAA,EAAIA,CAAAA,CAAI,WAAW,MAAM,CAAA,CAAA,CAAA,CAAA,CAGhEQ,CACX,CAAC,CAAA,CAED,OAAO,CAAA,2BAAA,EAA8BrC,EAAO,IAAI,CAAA,EAAA,EAAKoC,CAAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAC9E,CAIR,EASO,SAAS/B,CAAAA,CAAMiC,CAAAA,CAAcpB,EAAsD,CACtF,OAAO,CAAE,IAAA,CAAAoB,CAAAA,CAAM,OAAA,CAAApB,CAAQ,CAC3B,CAEO,SAASV,CAAAA,CAAO8B,CAAAA,CAAcC,EAAgD,CACjF,OAAO,CAAE,IAAA,CAAAD,EAAM,IAAA,CAAAC,CAAK,CACxB,CAEO,SAASC,EAAQF,CAAAA,CAAsC,CAC1D,OAAO,CAAE,KAAAA,CAAAA,CAAM,IAAA,CAAM,SAAU,CACnC,CAEO,SAASG,CAAAA,CAAKH,CAAAA,CAAsC,CACvD,OAAO,CAAE,IAAA,CAAAA,EAAM,IAAA,CAAM,MAAO,CAChC,CAEO,SAASI,CAAAA,CAAKJ,CAAAA,CAAsC,CACvD,OAAO,CAAE,KAAAA,CAAAA,CAAM,IAAA,CAAM,MAAO,CAChC,CAEO,SAASK,CAAAA,CAAKL,EAAsC,CACvD,OAAO,CAAE,IAAA,CAAAA,CAAAA,CAAM,KAAM,MAAO,CAChC,CAEO,SAASM,EAAQN,CAAAA,CAAsC,CAC1D,OAAO,CAAE,KAAAA,CAAAA,CAAM,IAAA,CAAM,SAAU,CACnC,CAGO,SAASO,CAAAA,CAAWhB,EAA6BiB,CAAAA,CAAgB,KAAA,CAA+B,CACnG,OAAO,CAAE,GAAGjB,CAAAA,CAAK,WAAY,IAAA,CAAM,aAAA,CAAAiB,CAAc,CACrD,CAEO,SAASC,CAAAA,CAAQlB,CAAAA,CAAqD,CACzE,OAAO,CAAE,GAAGA,EAAK,OAAA,CAAS,IAAK,CACnC,CAEO,SAASmB,CAAAA,CAAOnB,CAAAA,CAAqD,CACxE,OAAO,CAAE,GAAGA,CAAAA,CAAK,OAAQ,IAAK,CAClC,CAEO,SAASoB,EAAapB,CAAAA,CAA6BpB,CAAAA,CAA+C,CACrG,OAAO,CAAE,GAAGoB,CAAAA,CAAK,OAAA,CAASpB,CAAM,CACpC,CAEO,SAASyC,CAAAA,CAAWrB,EAA6BxB,CAAAA,CAAeG,CAAAA,CAAwC,CAC3G,OAAO,CAAE,GAAGqB,CAAAA,CAAK,WAAY,CAAE,KAAA,CAAAxB,EAAO,MAAA,CAAAG,CAAO,CAAE,CACnD","file":"main.cjs","sourcesContent":["// src/main.ts\n//\n// Developed with ❤️ by Maysara.\n\n\n\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\n\n import { Database } from 'bun:sqlite';\n import * as types from './types.d';\n export * from './types.d';\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\n\n export class DB {\n\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\n\n private db : Database;\n private schemas : Map<string, types.TableSchema>;\n private currentQuery : string = '';\n private currentParams : types.SqlValue[] = [];\n\n // └────────────────────────────────────────────────────────────────────┘\n\n\n // ┌──────────────────────────────── CORE ──────────────────────────────┐\n\n constructor(path: string = ':memory:') {\n this.schemas = new Map;\n this.db = new Database(path);\n this.db.exec('PRAGMA foreign_keys = ON');\n }\n\n close(): void {\n this.db.close();\n }\n\n // ════════ Schema Management ════════\n defineSchema(schema: types.TableSchema): void {\n this.schemas.set(schema.name, schema);\n const sql = this.generateCreateTableSQL(schema);\n this.db.exec(sql);\n\n // Create indexes\n if (schema.indexes) {\n for (const index of schema.indexes) {\n const uniqueStr = index.unique ? 'UNIQUE' : '';\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${index.name} ON ${schema.name} (${index.columns.join(', ')})`;\n this.db.exec(indexSql);\n }\n }\n }\n\n getSchema(tableName: string): types.TableSchema | undefined {\n return this.schemas.get(tableName);\n }\n\n listTables(): string[] {\n const result = this.db.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").all();\n return result.map((r: unknown) => (r as types.TableRow).name);\n }\n\n dropTable(tableName: string): void {\n this.db.exec(`DROP TABLE IF EXISTS ${tableName}`);\n this.schemas.delete(tableName);\n }\n\n // ════════ Query Builder ════════\n query(): types.QueryBuilder {\n this.reset();\n return this.createQueryBuilder();\n }\n\n // ════════ Quick Operations ════════\n find(table: string, conditions: Record<string, types.SqlValue>): unknown[] {\n const whereConditions: types.WhereCondition[] = Object.entries(conditions).map(([column, value]) => ({\n column,\n operator: '=' as const,\n value\n }));\n\n return this.query()\n .select()\n .from(table)\n .where(whereConditions)\n .execute();\n }\n\n findOne(table: string, conditions: Record<string, types.SqlValue>): unknown | null {\n return this.query()\n .select()\n .from(table)\n .where(Object.entries(conditions).map(([column, value]) => ({\n column,\n operator: '=' as const,\n value\n })))\n .limit(1)\n .executeOne();\n }\n\n findById(table: string, id: number | string): unknown | null {\n return this.findOne(table, { id });\n }\n\n all(table: string): unknown[] {\n return this.query().select().from(table).execute();\n }\n\n insert(table: string, data: Record<string, types.SqlValue>): unknown {\n this.query().insert(table, data).execute();\n\n // Return inserted row\n const lastId = this.db.query('SELECT last_insert_rowid() as id').get() as types.LastIdRow;\n return this.findById(table, lastId.id);\n }\n\n update(table: string, id: number | string, data: Record<string, types.SqlValue>): unknown | null {\n this.query()\n .update(table, data)\n .where({ column: 'id', operator: '=', value: id })\n .execute();\n\n return this.findById(table, id);\n }\n\n delete(table: string, id: number | string): boolean {\n this.query()\n .delete(table)\n .where({ column: 'id', operator: '=', value: id })\n .execute();\n\n return true;\n }\n\n // ════════ Transactions ════════\n transaction(callback: (db: DB) => void): void {\n this.db.exec('BEGIN TRANSACTION');\n try {\n callback(this);\n this.db.exec('COMMIT');\n } catch (error) {\n this.db.exec('ROLLBACK');\n throw error;\n }\n }\n\n // ════════ Raw SQL ════════\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n raw(sql: string, params: types.SqlValue[] = []): unknown[] {\n const stmt = this.db.query(sql);\n return stmt.all(...params) as unknown[];\n }\n\n rawOne(sql: string, params: types.SqlValue[] = []): unknown | null {\n const stmt = this.db.query(sql);\n return stmt.get(...params) as unknown | null;\n }\n\n // └────────────────────────────────────────────────────────────────────┘\n\n\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\n\n private reset(): void {\n this.currentQuery = '';\n this.currentParams = [];\n }\n\n private createQueryBuilder(): types.QueryBuilder {\n const builder: types.QueryBuilderInternal & Partial<types.QueryBuilder> & { buildWhereClause?: () => string } = {\n _select: ['*'],\n _from: '',\n _where: [],\n _orderBy: '',\n _limit: null,\n _offset: null,\n _isInsert: false,\n _isUpdate: false,\n _isDelete: false,\n _insertData: null,\n _updateData: null\n };\n\n // Bind methods to this DB instance\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n builder.select = function(columns?: string[]): types.QueryBuilder {\n this._select = columns || ['*'];\n return this as unknown as types.QueryBuilder;\n };\n\n builder.from = function(table: string): types.QueryBuilder {\n this._from = table;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.where = function(condition: types.WhereCondition | types.WhereCondition[]): types.QueryBuilder {\n const conditions = Array.isArray(condition) ? condition : [condition];\n\n const whereClauses = conditions.map(cond => {\n if (cond.operator === 'IS NULL' || cond.operator === 'IS NOT NULL') {\n return `${cond.column} ${cond.operator}`;\n } else if (cond.operator === 'IN' && Array.isArray(cond.value)) {\n const placeholders = cond.value.map(() => '?').join(', ');\n // Spread array values into params\n cond.value.forEach(val => {\n self.currentParams.push(val as types.SqlValue);\n });\n return `${cond.column} IN (${placeholders})`;\n } else {\n self.currentParams.push(cond.value as types.SqlValue);\n return `${cond.column} ${cond.operator} ?`;\n }\n });\n\n this._where.push(...whereClauses);\n return this as unknown as types.QueryBuilder;\n };\n\n builder.and = function(condition: types.WhereCondition): types.QueryBuilder {\n return this.where!(condition);\n };\n\n builder.or = function(condition: types.WhereCondition): types.QueryBuilder {\n let clause = '';\n if (condition.operator === 'IS NULL' || condition.operator === 'IS NOT NULL') {\n clause = `${condition.column} ${condition.operator}`;\n } else if (condition.operator === 'IN' && Array.isArray(condition.value)) {\n const placeholders = condition.value.map(() => '?').join(', ');\n // Spread array values into params\n condition.value.forEach(val => {\n self.currentParams.push(val as types.SqlValue);\n });\n clause = `${condition.column} IN (${placeholders})`;\n } else {\n self.currentParams.push(condition.value as types.SqlValue);\n clause = `${condition.column} ${condition.operator} ?`;\n }\n\n // Add OR prefix to the clause itself\n this._where.push(`OR ${clause}`);\n return this as unknown as types.QueryBuilder;\n };\n\n builder.orderBy = function(column: string, direction: 'ASC' | 'DESC' = 'ASC'): types.QueryBuilder {\n this._orderBy = `ORDER BY ${column} ${direction}`;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.limit = function(count: number): types.QueryBuilder {\n this._limit = count;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.offset = function(count: number): types.QueryBuilder {\n this._offset = count;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.insert = function(table: string, data: Record<string, types.SqlValue>): types.QueryBuilder {\n this._isInsert = true;\n this._from = table;\n this._insertData = data;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.update = function(table: string, data: Record<string, types.SqlValue>): types.QueryBuilder {\n this._isUpdate = true;\n this._from = table;\n this._updateData = data;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.delete = function(table: string): types.QueryBuilder {\n this._isDelete = true;\n this._from = table;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.raw = function(sql: string, params: types.SqlValue[] = []): types.QueryBuilder {\n self.currentQuery = sql;\n self.currentParams = params;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.execute = function(): unknown[] {\n let sql = '';\n\n if (this._isInsert && this._insertData) {\n const columns = Object.keys(this._insertData);\n const values = Object.values(this._insertData);\n\n // Handle empty insert (all defaults)\n if (columns.length === 0) {\n sql = `INSERT INTO ${this._from} DEFAULT VALUES`;\n self.currentParams = [];\n } else {\n const placeholders = columns.map(() => '?').join(', ');\n sql = `INSERT INTO ${this._from} (${columns.join(', ')}) VALUES (${placeholders})`;\n self.currentParams = values;\n }\n } else if (this._isUpdate && this._updateData) {\n const setClauses = Object.keys(this._updateData).map(col => `${col} = ?`);\n const updateValues = Object.values(this._updateData);\n self.currentParams = [...updateValues, ...self.currentParams] as types.SqlValue[];\n sql = `UPDATE ${this._from} SET ${setClauses.join(', ')}`;\n\n if (this._where.length > 0) {\n // Build WHERE clause properly handling OR conditions\n const whereClause = this.buildWhereClause!();\n sql += ` WHERE ${whereClause}`;\n }\n } else if (this._isDelete) {\n sql = `DELETE FROM ${this._from}`;\n\n if (this._where.length > 0) {\n // Build WHERE clause properly handling OR conditions\n const whereClause = this.buildWhereClause!();\n sql += ` WHERE ${whereClause}`;\n }\n } else {\n // SELECT query or raw query\n if (self.currentQuery) {\n sql = self.currentQuery;\n } else {\n sql = `SELECT ${this._select.join(', ')} FROM ${this._from}`;\n\n if (this._where.length > 0) {\n // Build WHERE clause properly handling OR conditions\n const whereClause = this.buildWhereClause!();\n sql += ` WHERE ${whereClause}`;\n }\n\n if (this._orderBy) {\n sql += ` ${this._orderBy}`;\n }\n\n if (this._limit !== null) {\n sql += ` LIMIT ${this._limit}`;\n }\n\n // OFFSET requires LIMIT in SQLite\n if (this._offset !== null) {\n if (this._limit === null) {\n // Add a very large limit if offset is used without limit\n sql += ` LIMIT -1`;\n }\n sql += ` OFFSET ${this._offset}`;\n }\n }\n }\n\n const stmt = self.db.query(sql);\n const result = stmt.all(...self.currentParams) as unknown[];\n self.reset();\n return result;\n };\n\n builder.buildWhereClause = function(): string {\n const parts: string[] = [];\n for (let i = 0; i < this._where.length; i++) {\n const clause = this._where[i];\n if (clause.startsWith('OR ')) {\n parts.push('OR');\n parts.push(clause.substring(3)); // Remove 'OR ' prefix\n } else {\n if (i > 0 && !this._where[i - 1].startsWith('OR ')) {\n parts.push('AND');\n }\n parts.push(clause);\n }\n }\n return parts.join(' ');\n };\n\n builder.executeOne = function(): unknown | null {\n const results = this.execute!();\n return results.length > 0 ? results[0] : null;\n };\n\n builder.executeRaw = function(sql: string, params: types.SqlValue[] = []): unknown[] {\n const stmt = self.db.query(sql);\n const result = stmt.all(...params) as unknown[];\n return result;\n };\n\n return builder as types.QueryBuilder;\n }\n\n private generateCreateTableSQL(schema: types.TableSchema): string {\n const columnDefs = schema.columns.map(col => {\n let def = `${col.name} ${col.type}`;\n\n if (col.primaryKey) {\n def += ' PRIMARY KEY';\n if (col.autoIncrement) {\n def += ' AUTOINCREMENT';\n }\n }\n\n if (col.notNull && !col.primaryKey) {\n def += ' NOT NULL';\n }\n\n if (col.unique) {\n def += ' UNIQUE';\n }\n\n if (col.default !== undefined) {\n if (typeof col.default === 'string') {\n def += ` DEFAULT '${col.default}'`;\n } else if (col.default === null) {\n def += ' DEFAULT NULL';\n } else {\n def += ` DEFAULT ${col.default}`;\n }\n }\n\n if (col.references) {\n def += ` REFERENCES ${col.references.table}(${col.references.column})`;\n }\n\n return def;\n });\n\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${columnDefs.join(', ')})`;\n }\n\n // └────────────────────────────────────────────────────────────────────┘\n\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\n\n // ════════ Schema Builder Helpers ════════\n export function table(name: string, columns: types.ColumnDefinition[]): types.TableSchema {\n return { name, columns };\n }\n\n export function column(name: string, type: types.ColumnType): types.ColumnDefinition {\n return { name, type };\n }\n\n export function integer(name: string): types.ColumnDefinition {\n return { name, type: 'INTEGER' };\n }\n\n export function text(name: string): types.ColumnDefinition {\n return { name, type: 'TEXT' };\n }\n\n export function real(name: string): types.ColumnDefinition {\n return { name, type: 'REAL' };\n }\n\n export function blob(name: string): types.ColumnDefinition {\n return { name, type: 'BLOB' };\n }\n\n export function numeric(name: string): types.ColumnDefinition {\n return { name, type: 'NUMERIC' };\n }\n\n // ════════ Column Modifiers ════════\n export function primaryKey(col: types.ColumnDefinition, autoIncrement = false): types.ColumnDefinition {\n return { ...col, primaryKey: true, autoIncrement };\n }\n\n export function notNull(col: types.ColumnDefinition): types.ColumnDefinition {\n return { ...col, notNull: true };\n }\n\n export function unique(col: types.ColumnDefinition): types.ColumnDefinition {\n return { ...col, unique: true };\n }\n\n export function defaultValue(col: types.ColumnDefinition, value: types.SqlValue): types.ColumnDefinition {\n return { ...col, default: value };\n }\n\n export function references(col: types.ColumnDefinition, table: string, column: string): types.ColumnDefinition {\n return { ...col, references: { table, column } };\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
@@ -0,0 +1,115 @@
1
+ // src/types.d.ts
2
+ //
3
+ // Developed with ❤️ by Maysara.
4
+
5
+
6
+
7
+ // ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗
8
+
9
+ type ColumnType = 'INTEGER' | 'TEXT' | 'REAL' | 'BLOB' | 'NUMERIC';
10
+ type SqlValue = string | number | boolean | null | Uint8Array;
11
+
12
+ interface ColumnDefinition {
13
+ name : string;
14
+ type : ColumnType;
15
+ primaryKey? : boolean;
16
+ autoIncrement? : boolean;
17
+ notNull? : boolean;
18
+ unique? : boolean;
19
+ default? : SqlValue;
20
+ references? : { table: string; column: string };
21
+ }
22
+
23
+ interface TableSchema {
24
+ name : string;
25
+ columns : ColumnDefinition[];
26
+ indexes? : { name: string; columns: string[]; unique?: boolean }[];
27
+ }
28
+
29
+ interface WhereCondition {
30
+ column : string;
31
+ operator : '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'IN' | 'IS NULL' | 'IS NOT NULL';
32
+ value? : SqlValue | SqlValue[];
33
+ }
34
+
35
+ interface QueryBuilder {
36
+ select : (columns?: string[]) => QueryBuilder;
37
+ from : (table: string) => QueryBuilder;
38
+ where : (condition: WhereCondition | WhereCondition[]) => QueryBuilder;
39
+ and : (condition: WhereCondition) => QueryBuilder;
40
+ or : (condition: WhereCondition) => QueryBuilder;
41
+ orderBy : (column: string, direction?: 'ASC' | 'DESC') => QueryBuilder;
42
+ limit : (count: number) => QueryBuilder;
43
+ offset : (count: number) => QueryBuilder;
44
+ insert : (table: string, data: Record<string, SqlValue>) => QueryBuilder;
45
+ update : (table: string, data: Record<string, SqlValue>) => QueryBuilder;
46
+ delete : (table: string) => QueryBuilder;
47
+ execute : () => unknown[];
48
+ executeOne : () => unknown | null;
49
+ executeRaw : (sql: string, params?: SqlValue[]) => unknown[];
50
+ raw : (sql: string, params?: SqlValue[]) => QueryBuilder;
51
+ }
52
+
53
+ interface TableRow {
54
+ name : string;
55
+ }
56
+
57
+ interface LastIdRow {
58
+ id : number | string;
59
+ }
60
+
61
+ interface QueryBuilderInternal {
62
+ _select : string[];
63
+ _from : string;
64
+ _where : string[];
65
+ _orderBy : string;
66
+ _limit : number | null;
67
+ _offset : number | null;
68
+ _isInsert : boolean;
69
+ _isUpdate : boolean;
70
+ _isDelete : boolean;
71
+ _insertData : Record<string, SqlValue> | null;
72
+ _updateData : Record<string, SqlValue> | null;
73
+ }
74
+
75
+ declare class DB {
76
+ private db;
77
+ private schemas;
78
+ private currentQuery;
79
+ private currentParams;
80
+ constructor(path?: string);
81
+ close(): void;
82
+ defineSchema(schema: TableSchema): void;
83
+ getSchema(tableName: string): TableSchema | undefined;
84
+ listTables(): string[];
85
+ dropTable(tableName: string): void;
86
+ query(): QueryBuilder;
87
+ find(table: string, conditions: Record<string, SqlValue>): unknown[];
88
+ findOne(table: string, conditions: Record<string, SqlValue>): unknown | null;
89
+ findById(table: string, id: number | string): unknown | null;
90
+ all(table: string): unknown[];
91
+ insert(table: string, data: Record<string, SqlValue>): unknown;
92
+ update(table: string, id: number | string, data: Record<string, SqlValue>): unknown | null;
93
+ delete(table: string, id: number | string): boolean;
94
+ transaction(callback: (db: DB) => void): void;
95
+ exec(sql: string): void;
96
+ raw(sql: string, params?: SqlValue[]): unknown[];
97
+ rawOne(sql: string, params?: SqlValue[]): unknown | null;
98
+ private reset;
99
+ private createQueryBuilder;
100
+ private generateCreateTableSQL;
101
+ }
102
+ declare function table(name: string, columns: ColumnDefinition[]): TableSchema;
103
+ declare function column(name: string, type: ColumnType): ColumnDefinition;
104
+ declare function integer(name: string): ColumnDefinition;
105
+ declare function text(name: string): ColumnDefinition;
106
+ declare function real(name: string): ColumnDefinition;
107
+ declare function blob(name: string): ColumnDefinition;
108
+ declare function numeric(name: string): ColumnDefinition;
109
+ declare function primaryKey(col: ColumnDefinition, autoIncrement?: boolean): ColumnDefinition;
110
+ declare function notNull(col: ColumnDefinition): ColumnDefinition;
111
+ declare function unique(col: ColumnDefinition): ColumnDefinition;
112
+ declare function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition;
113
+ declare function references(col: ColumnDefinition, table: string, column: string): ColumnDefinition;
114
+
115
+ export { type ColumnDefinition, type ColumnType, DB, type LastIdRow, type QueryBuilder, type QueryBuilderInternal, type SqlValue, type TableRow, type TableSchema, type WhereCondition, blob, column, defaultValue, integer, notNull, numeric, primaryKey, real, references, table, text, unique };
package/dist/main.d.ts ADDED
@@ -0,0 +1,115 @@
1
+ // src/types.d.ts
2
+ //
3
+ // Developed with ❤️ by Maysara.
4
+
5
+
6
+
7
+ // ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗
8
+
9
+ type ColumnType = 'INTEGER' | 'TEXT' | 'REAL' | 'BLOB' | 'NUMERIC';
10
+ type SqlValue = string | number | boolean | null | Uint8Array;
11
+
12
+ interface ColumnDefinition {
13
+ name : string;
14
+ type : ColumnType;
15
+ primaryKey? : boolean;
16
+ autoIncrement? : boolean;
17
+ notNull? : boolean;
18
+ unique? : boolean;
19
+ default? : SqlValue;
20
+ references? : { table: string; column: string };
21
+ }
22
+
23
+ interface TableSchema {
24
+ name : string;
25
+ columns : ColumnDefinition[];
26
+ indexes? : { name: string; columns: string[]; unique?: boolean }[];
27
+ }
28
+
29
+ interface WhereCondition {
30
+ column : string;
31
+ operator : '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'IN' | 'IS NULL' | 'IS NOT NULL';
32
+ value? : SqlValue | SqlValue[];
33
+ }
34
+
35
+ interface QueryBuilder {
36
+ select : (columns?: string[]) => QueryBuilder;
37
+ from : (table: string) => QueryBuilder;
38
+ where : (condition: WhereCondition | WhereCondition[]) => QueryBuilder;
39
+ and : (condition: WhereCondition) => QueryBuilder;
40
+ or : (condition: WhereCondition) => QueryBuilder;
41
+ orderBy : (column: string, direction?: 'ASC' | 'DESC') => QueryBuilder;
42
+ limit : (count: number) => QueryBuilder;
43
+ offset : (count: number) => QueryBuilder;
44
+ insert : (table: string, data: Record<string, SqlValue>) => QueryBuilder;
45
+ update : (table: string, data: Record<string, SqlValue>) => QueryBuilder;
46
+ delete : (table: string) => QueryBuilder;
47
+ execute : () => unknown[];
48
+ executeOne : () => unknown | null;
49
+ executeRaw : (sql: string, params?: SqlValue[]) => unknown[];
50
+ raw : (sql: string, params?: SqlValue[]) => QueryBuilder;
51
+ }
52
+
53
+ interface TableRow {
54
+ name : string;
55
+ }
56
+
57
+ interface LastIdRow {
58
+ id : number | string;
59
+ }
60
+
61
+ interface QueryBuilderInternal {
62
+ _select : string[];
63
+ _from : string;
64
+ _where : string[];
65
+ _orderBy : string;
66
+ _limit : number | null;
67
+ _offset : number | null;
68
+ _isInsert : boolean;
69
+ _isUpdate : boolean;
70
+ _isDelete : boolean;
71
+ _insertData : Record<string, SqlValue> | null;
72
+ _updateData : Record<string, SqlValue> | null;
73
+ }
74
+
75
+ declare class DB {
76
+ private db;
77
+ private schemas;
78
+ private currentQuery;
79
+ private currentParams;
80
+ constructor(path?: string);
81
+ close(): void;
82
+ defineSchema(schema: TableSchema): void;
83
+ getSchema(tableName: string): TableSchema | undefined;
84
+ listTables(): string[];
85
+ dropTable(tableName: string): void;
86
+ query(): QueryBuilder;
87
+ find(table: string, conditions: Record<string, SqlValue>): unknown[];
88
+ findOne(table: string, conditions: Record<string, SqlValue>): unknown | null;
89
+ findById(table: string, id: number | string): unknown | null;
90
+ all(table: string): unknown[];
91
+ insert(table: string, data: Record<string, SqlValue>): unknown;
92
+ update(table: string, id: number | string, data: Record<string, SqlValue>): unknown | null;
93
+ delete(table: string, id: number | string): boolean;
94
+ transaction(callback: (db: DB) => void): void;
95
+ exec(sql: string): void;
96
+ raw(sql: string, params?: SqlValue[]): unknown[];
97
+ rawOne(sql: string, params?: SqlValue[]): unknown | null;
98
+ private reset;
99
+ private createQueryBuilder;
100
+ private generateCreateTableSQL;
101
+ }
102
+ declare function table(name: string, columns: ColumnDefinition[]): TableSchema;
103
+ declare function column(name: string, type: ColumnType): ColumnDefinition;
104
+ declare function integer(name: string): ColumnDefinition;
105
+ declare function text(name: string): ColumnDefinition;
106
+ declare function real(name: string): ColumnDefinition;
107
+ declare function blob(name: string): ColumnDefinition;
108
+ declare function numeric(name: string): ColumnDefinition;
109
+ declare function primaryKey(col: ColumnDefinition, autoIncrement?: boolean): ColumnDefinition;
110
+ declare function notNull(col: ColumnDefinition): ColumnDefinition;
111
+ declare function unique(col: ColumnDefinition): ColumnDefinition;
112
+ declare function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition;
113
+ declare function references(col: ColumnDefinition, table: string, column: string): ColumnDefinition;
114
+
115
+ export { type ColumnDefinition, type ColumnType, DB, type LastIdRow, type QueryBuilder, type QueryBuilderInternal, type SqlValue, type TableRow, type TableSchema, type WhereCondition, blob, column, defaultValue, integer, notNull, numeric, primaryKey, real, references, table, text, unique };
package/dist/main.js ADDED
@@ -0,0 +1,2 @@
1
+ import {Database}from'bun:sqlite';var o=class{constructor(t=":memory:"){this.currentQuery="";this.currentParams=[];this.schemas=new Map,this.db=new Database(t),this.db.exec("PRAGMA foreign_keys = ON");}close(){this.db.close();}defineSchema(t){this.schemas.set(t.name,t);let r=this.generateCreateTableSQL(t);if(this.db.exec(r),t.indexes)for(let e of t.indexes){let u=`CREATE ${e.unique?"UNIQUE":""} INDEX IF NOT EXISTS ${e.name} ON ${t.name} (${e.columns.join(", ")})`;this.db.exec(u);}}getSchema(t){return this.schemas.get(t)}listTables(){return this.db.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all().map(r=>r.name)}dropTable(t){this.db.exec(`DROP TABLE IF EXISTS ${t}`),this.schemas.delete(t);}query(){return this.reset(),this.createQueryBuilder()}find(t,r){let e=Object.entries(r).map(([s,u])=>({column:s,operator:"=",value:u}));return this.query().select().from(t).where(e).execute()}findOne(t,r){return this.query().select().from(t).where(Object.entries(r).map(([e,s])=>({column:e,operator:"=",value:s}))).limit(1).executeOne()}findById(t,r){return this.findOne(t,{id:r})}all(t){return this.query().select().from(t).execute()}insert(t,r){this.query().insert(t,r).execute();let e=this.db.query("SELECT last_insert_rowid() as id").get();return this.findById(t,e.id)}update(t,r,e){return this.query().update(t,e).where({column:"id",operator:"=",value:r}).execute(),this.findById(t,r)}delete(t,r){return this.query().delete(t).where({column:"id",operator:"=",value:r}).execute(),true}transaction(t){this.db.exec("BEGIN TRANSACTION");try{t(this),this.db.exec("COMMIT");}catch(r){throw this.db.exec("ROLLBACK"),r}}exec(t){this.db.exec(t);}raw(t,r=[]){return this.db.query(t).all(...r)}rawOne(t,r=[]){return this.db.query(t).get(...r)}reset(){this.currentQuery="",this.currentParams=[];}createQueryBuilder(){let t={_select:["*"],_from:"",_where:[],_orderBy:"",_limit:null,_offset:null,_isInsert:false,_isUpdate:false,_isDelete:false,_insertData:null,_updateData:null},r=this;return t.select=function(e){return this._select=e||["*"],this},t.from=function(e){return this._from=e,this},t.where=function(e){let u=(Array.isArray(e)?e:[e]).map(n=>{if(n.operator==="IS NULL"||n.operator==="IS NOT NULL")return `${n.column} ${n.operator}`;if(n.operator==="IN"&&Array.isArray(n.value)){let l=n.value.map(()=>"?").join(", ");return n.value.forEach(a=>{r.currentParams.push(a);}),`${n.column} IN (${l})`}else return r.currentParams.push(n.value),`${n.column} ${n.operator} ?`});return this._where.push(...u),this},t.and=function(e){return this.where(e)},t.or=function(e){let s="";if(e.operator==="IS NULL"||e.operator==="IS NOT NULL")s=`${e.column} ${e.operator}`;else if(e.operator==="IN"&&Array.isArray(e.value)){let u=e.value.map(()=>"?").join(", ");e.value.forEach(n=>{r.currentParams.push(n);}),s=`${e.column} IN (${u})`;}else r.currentParams.push(e.value),s=`${e.column} ${e.operator} ?`;return this._where.push(`OR ${s}`),this},t.orderBy=function(e,s="ASC"){return this._orderBy=`ORDER BY ${e} ${s}`,this},t.limit=function(e){return this._limit=e,this},t.offset=function(e){return this._offset=e,this},t.insert=function(e,s){return this._isInsert=true,this._from=e,this._insertData=s,this},t.update=function(e,s){return this._isUpdate=true,this._from=e,this._updateData=s,this},t.delete=function(e){return this._isDelete=true,this._from=e,this},t.raw=function(e,s=[]){return r.currentQuery=e,r.currentParams=s,this},t.execute=function(){let e="";if(this._isInsert&&this._insertData){let n=Object.keys(this._insertData),l=Object.values(this._insertData);if(n.length===0)e=`INSERT INTO ${this._from} DEFAULT VALUES`,r.currentParams=[];else {let a=n.map(()=>"?").join(", ");e=`INSERT INTO ${this._from} (${n.join(", ")}) VALUES (${a})`,r.currentParams=l;}}else if(this._isUpdate&&this._updateData){let n=Object.keys(this._updateData).map(a=>`${a} = ?`),l=Object.values(this._updateData);if(r.currentParams=[...l,...r.currentParams],e=`UPDATE ${this._from} SET ${n.join(", ")}`,this._where.length>0){let a=this.buildWhereClause();e+=` WHERE ${a}`;}}else if(this._isDelete){if(e=`DELETE FROM ${this._from}`,this._where.length>0){let n=this.buildWhereClause();e+=` WHERE ${n}`;}}else if(r.currentQuery)e=r.currentQuery;else {if(e=`SELECT ${this._select.join(", ")} FROM ${this._from}`,this._where.length>0){let n=this.buildWhereClause();e+=` WHERE ${n}`;}this._orderBy&&(e+=` ${this._orderBy}`),this._limit!==null&&(e+=` LIMIT ${this._limit}`),this._offset!==null&&(this._limit===null&&(e+=" LIMIT -1"),e+=` OFFSET ${this._offset}`);}let u=r.db.query(e).all(...r.currentParams);return r.reset(),u},t.buildWhereClause=function(){let e=[];for(let s=0;s<this._where.length;s++){let u=this._where[s];u.startsWith("OR ")?(e.push("OR"),e.push(u.substring(3))):(s>0&&!this._where[s-1].startsWith("OR ")&&e.push("AND"),e.push(u));}return e.join(" ")},t.executeOne=function(){let e=this.execute();return e.length>0?e[0]:null},t.executeRaw=function(e,s=[]){return r.db.query(e).all(...s)},t}generateCreateTableSQL(t){let r=t.columns.map(e=>{let s=`${e.name} ${e.type}`;return e.primaryKey&&(s+=" PRIMARY KEY",e.autoIncrement&&(s+=" AUTOINCREMENT")),e.notNull&&!e.primaryKey&&(s+=" NOT NULL"),e.unique&&(s+=" UNIQUE"),e.default!==void 0&&(typeof e.default=="string"?s+=` DEFAULT '${e.default}'`:e.default===null?s+=" DEFAULT NULL":s+=` DEFAULT ${e.default}`),e.references&&(s+=` REFERENCES ${e.references.table}(${e.references.column})`),s});return `CREATE TABLE IF NOT EXISTS ${t.name} (${r.join(", ")})`}};function h(i,t){return {name:i,columns:t}}function f(i,t){return {name:i,type:t}}function c(i){return {name:i,type:"INTEGER"}}function m(i){return {name:i,type:"TEXT"}}function d(i){return {name:i,type:"REAL"}}function g(i){return {name:i,type:"BLOB"}}function _(i){return {name:i,type:"NUMERIC"}}function E(i,t=false){return {...i,primaryKey:true,autoIncrement:t}}function w(i){return {...i,notNull:true}}function S(i){return {...i,unique:true}}function b(i,t){return {...i,default:t}}function C(i,t,r){return {...i,references:{table:t,column:r}}}export{o as DB,g as blob,f as column,b as defaultValue,c as integer,w as notNull,_ as numeric,E as primaryKey,d as real,C as references,h as table,m as text,S as unique};//# sourceMappingURL=main.js.map
2
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main.ts"],"names":["DB","path","Database","schema","sql","index","indexSql","tableName","table","conditions","whereConditions","column","value","id","data","lastId","callback","error","params","builder","self","columns","condition","whereClauses","cond","placeholders","val","clause","direction","count","values","setClauses","col","updateValues","whereClause","result","parts","i","results","columnDefs","def","name","type","integer","text","real","blob","numeric","primaryKey","autoIncrement","notNull","unique","defaultValue","references"],"mappings":"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","file":"main.js","sourcesContent":["// src/main.ts\n//\n// Developed with ❤️ by Maysara.\n\n\n\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\n\n import { Database } from 'bun:sqlite';\n import * as types from './types.d';\n export * from './types.d';\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\n\n export class DB {\n\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\n\n private db : Database;\n private schemas : Map<string, types.TableSchema>;\n private currentQuery : string = '';\n private currentParams : types.SqlValue[] = [];\n\n // └────────────────────────────────────────────────────────────────────┘\n\n\n // ┌──────────────────────────────── CORE ──────────────────────────────┐\n\n constructor(path: string = ':memory:') {\n this.schemas = new Map;\n this.db = new Database(path);\n this.db.exec('PRAGMA foreign_keys = ON');\n }\n\n close(): void {\n this.db.close();\n }\n\n // ════════ Schema Management ════════\n defineSchema(schema: types.TableSchema): void {\n this.schemas.set(schema.name, schema);\n const sql = this.generateCreateTableSQL(schema);\n this.db.exec(sql);\n\n // Create indexes\n if (schema.indexes) {\n for (const index of schema.indexes) {\n const uniqueStr = index.unique ? 'UNIQUE' : '';\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${index.name} ON ${schema.name} (${index.columns.join(', ')})`;\n this.db.exec(indexSql);\n }\n }\n }\n\n getSchema(tableName: string): types.TableSchema | undefined {\n return this.schemas.get(tableName);\n }\n\n listTables(): string[] {\n const result = this.db.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").all();\n return result.map((r: unknown) => (r as types.TableRow).name);\n }\n\n dropTable(tableName: string): void {\n this.db.exec(`DROP TABLE IF EXISTS ${tableName}`);\n this.schemas.delete(tableName);\n }\n\n // ════════ Query Builder ════════\n query(): types.QueryBuilder {\n this.reset();\n return this.createQueryBuilder();\n }\n\n // ════════ Quick Operations ════════\n find(table: string, conditions: Record<string, types.SqlValue>): unknown[] {\n const whereConditions: types.WhereCondition[] = Object.entries(conditions).map(([column, value]) => ({\n column,\n operator: '=' as const,\n value\n }));\n\n return this.query()\n .select()\n .from(table)\n .where(whereConditions)\n .execute();\n }\n\n findOne(table: string, conditions: Record<string, types.SqlValue>): unknown | null {\n return this.query()\n .select()\n .from(table)\n .where(Object.entries(conditions).map(([column, value]) => ({\n column,\n operator: '=' as const,\n value\n })))\n .limit(1)\n .executeOne();\n }\n\n findById(table: string, id: number | string): unknown | null {\n return this.findOne(table, { id });\n }\n\n all(table: string): unknown[] {\n return this.query().select().from(table).execute();\n }\n\n insert(table: string, data: Record<string, types.SqlValue>): unknown {\n this.query().insert(table, data).execute();\n\n // Return inserted row\n const lastId = this.db.query('SELECT last_insert_rowid() as id').get() as types.LastIdRow;\n return this.findById(table, lastId.id);\n }\n\n update(table: string, id: number | string, data: Record<string, types.SqlValue>): unknown | null {\n this.query()\n .update(table, data)\n .where({ column: 'id', operator: '=', value: id })\n .execute();\n\n return this.findById(table, id);\n }\n\n delete(table: string, id: number | string): boolean {\n this.query()\n .delete(table)\n .where({ column: 'id', operator: '=', value: id })\n .execute();\n\n return true;\n }\n\n // ════════ Transactions ════════\n transaction(callback: (db: DB) => void): void {\n this.db.exec('BEGIN TRANSACTION');\n try {\n callback(this);\n this.db.exec('COMMIT');\n } catch (error) {\n this.db.exec('ROLLBACK');\n throw error;\n }\n }\n\n // ════════ Raw SQL ════════\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n raw(sql: string, params: types.SqlValue[] = []): unknown[] {\n const stmt = this.db.query(sql);\n return stmt.all(...params) as unknown[];\n }\n\n rawOne(sql: string, params: types.SqlValue[] = []): unknown | null {\n const stmt = this.db.query(sql);\n return stmt.get(...params) as unknown | null;\n }\n\n // └────────────────────────────────────────────────────────────────────┘\n\n\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\n\n private reset(): void {\n this.currentQuery = '';\n this.currentParams = [];\n }\n\n private createQueryBuilder(): types.QueryBuilder {\n const builder: types.QueryBuilderInternal & Partial<types.QueryBuilder> & { buildWhereClause?: () => string } = {\n _select: ['*'],\n _from: '',\n _where: [],\n _orderBy: '',\n _limit: null,\n _offset: null,\n _isInsert: false,\n _isUpdate: false,\n _isDelete: false,\n _insertData: null,\n _updateData: null\n };\n\n // Bind methods to this DB instance\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n builder.select = function(columns?: string[]): types.QueryBuilder {\n this._select = columns || ['*'];\n return this as unknown as types.QueryBuilder;\n };\n\n builder.from = function(table: string): types.QueryBuilder {\n this._from = table;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.where = function(condition: types.WhereCondition | types.WhereCondition[]): types.QueryBuilder {\n const conditions = Array.isArray(condition) ? condition : [condition];\n\n const whereClauses = conditions.map(cond => {\n if (cond.operator === 'IS NULL' || cond.operator === 'IS NOT NULL') {\n return `${cond.column} ${cond.operator}`;\n } else if (cond.operator === 'IN' && Array.isArray(cond.value)) {\n const placeholders = cond.value.map(() => '?').join(', ');\n // Spread array values into params\n cond.value.forEach(val => {\n self.currentParams.push(val as types.SqlValue);\n });\n return `${cond.column} IN (${placeholders})`;\n } else {\n self.currentParams.push(cond.value as types.SqlValue);\n return `${cond.column} ${cond.operator} ?`;\n }\n });\n\n this._where.push(...whereClauses);\n return this as unknown as types.QueryBuilder;\n };\n\n builder.and = function(condition: types.WhereCondition): types.QueryBuilder {\n return this.where!(condition);\n };\n\n builder.or = function(condition: types.WhereCondition): types.QueryBuilder {\n let clause = '';\n if (condition.operator === 'IS NULL' || condition.operator === 'IS NOT NULL') {\n clause = `${condition.column} ${condition.operator}`;\n } else if (condition.operator === 'IN' && Array.isArray(condition.value)) {\n const placeholders = condition.value.map(() => '?').join(', ');\n // Spread array values into params\n condition.value.forEach(val => {\n self.currentParams.push(val as types.SqlValue);\n });\n clause = `${condition.column} IN (${placeholders})`;\n } else {\n self.currentParams.push(condition.value as types.SqlValue);\n clause = `${condition.column} ${condition.operator} ?`;\n }\n\n // Add OR prefix to the clause itself\n this._where.push(`OR ${clause}`);\n return this as unknown as types.QueryBuilder;\n };\n\n builder.orderBy = function(column: string, direction: 'ASC' | 'DESC' = 'ASC'): types.QueryBuilder {\n this._orderBy = `ORDER BY ${column} ${direction}`;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.limit = function(count: number): types.QueryBuilder {\n this._limit = count;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.offset = function(count: number): types.QueryBuilder {\n this._offset = count;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.insert = function(table: string, data: Record<string, types.SqlValue>): types.QueryBuilder {\n this._isInsert = true;\n this._from = table;\n this._insertData = data;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.update = function(table: string, data: Record<string, types.SqlValue>): types.QueryBuilder {\n this._isUpdate = true;\n this._from = table;\n this._updateData = data;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.delete = function(table: string): types.QueryBuilder {\n this._isDelete = true;\n this._from = table;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.raw = function(sql: string, params: types.SqlValue[] = []): types.QueryBuilder {\n self.currentQuery = sql;\n self.currentParams = params;\n return this as unknown as types.QueryBuilder;\n };\n\n builder.execute = function(): unknown[] {\n let sql = '';\n\n if (this._isInsert && this._insertData) {\n const columns = Object.keys(this._insertData);\n const values = Object.values(this._insertData);\n\n // Handle empty insert (all defaults)\n if (columns.length === 0) {\n sql = `INSERT INTO ${this._from} DEFAULT VALUES`;\n self.currentParams = [];\n } else {\n const placeholders = columns.map(() => '?').join(', ');\n sql = `INSERT INTO ${this._from} (${columns.join(', ')}) VALUES (${placeholders})`;\n self.currentParams = values;\n }\n } else if (this._isUpdate && this._updateData) {\n const setClauses = Object.keys(this._updateData).map(col => `${col} = ?`);\n const updateValues = Object.values(this._updateData);\n self.currentParams = [...updateValues, ...self.currentParams] as types.SqlValue[];\n sql = `UPDATE ${this._from} SET ${setClauses.join(', ')}`;\n\n if (this._where.length > 0) {\n // Build WHERE clause properly handling OR conditions\n const whereClause = this.buildWhereClause!();\n sql += ` WHERE ${whereClause}`;\n }\n } else if (this._isDelete) {\n sql = `DELETE FROM ${this._from}`;\n\n if (this._where.length > 0) {\n // Build WHERE clause properly handling OR conditions\n const whereClause = this.buildWhereClause!();\n sql += ` WHERE ${whereClause}`;\n }\n } else {\n // SELECT query or raw query\n if (self.currentQuery) {\n sql = self.currentQuery;\n } else {\n sql = `SELECT ${this._select.join(', ')} FROM ${this._from}`;\n\n if (this._where.length > 0) {\n // Build WHERE clause properly handling OR conditions\n const whereClause = this.buildWhereClause!();\n sql += ` WHERE ${whereClause}`;\n }\n\n if (this._orderBy) {\n sql += ` ${this._orderBy}`;\n }\n\n if (this._limit !== null) {\n sql += ` LIMIT ${this._limit}`;\n }\n\n // OFFSET requires LIMIT in SQLite\n if (this._offset !== null) {\n if (this._limit === null) {\n // Add a very large limit if offset is used without limit\n sql += ` LIMIT -1`;\n }\n sql += ` OFFSET ${this._offset}`;\n }\n }\n }\n\n const stmt = self.db.query(sql);\n const result = stmt.all(...self.currentParams) as unknown[];\n self.reset();\n return result;\n };\n\n builder.buildWhereClause = function(): string {\n const parts: string[] = [];\n for (let i = 0; i < this._where.length; i++) {\n const clause = this._where[i];\n if (clause.startsWith('OR ')) {\n parts.push('OR');\n parts.push(clause.substring(3)); // Remove 'OR ' prefix\n } else {\n if (i > 0 && !this._where[i - 1].startsWith('OR ')) {\n parts.push('AND');\n }\n parts.push(clause);\n }\n }\n return parts.join(' ');\n };\n\n builder.executeOne = function(): unknown | null {\n const results = this.execute!();\n return results.length > 0 ? results[0] : null;\n };\n\n builder.executeRaw = function(sql: string, params: types.SqlValue[] = []): unknown[] {\n const stmt = self.db.query(sql);\n const result = stmt.all(...params) as unknown[];\n return result;\n };\n\n return builder as types.QueryBuilder;\n }\n\n private generateCreateTableSQL(schema: types.TableSchema): string {\n const columnDefs = schema.columns.map(col => {\n let def = `${col.name} ${col.type}`;\n\n if (col.primaryKey) {\n def += ' PRIMARY KEY';\n if (col.autoIncrement) {\n def += ' AUTOINCREMENT';\n }\n }\n\n if (col.notNull && !col.primaryKey) {\n def += ' NOT NULL';\n }\n\n if (col.unique) {\n def += ' UNIQUE';\n }\n\n if (col.default !== undefined) {\n if (typeof col.default === 'string') {\n def += ` DEFAULT '${col.default}'`;\n } else if (col.default === null) {\n def += ' DEFAULT NULL';\n } else {\n def += ` DEFAULT ${col.default}`;\n }\n }\n\n if (col.references) {\n def += ` REFERENCES ${col.references.table}(${col.references.column})`;\n }\n\n return def;\n });\n\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${columnDefs.join(', ')})`;\n }\n\n // └────────────────────────────────────────────────────────────────────┘\n\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\n\n // ════════ Schema Builder Helpers ════════\n export function table(name: string, columns: types.ColumnDefinition[]): types.TableSchema {\n return { name, columns };\n }\n\n export function column(name: string, type: types.ColumnType): types.ColumnDefinition {\n return { name, type };\n }\n\n export function integer(name: string): types.ColumnDefinition {\n return { name, type: 'INTEGER' };\n }\n\n export function text(name: string): types.ColumnDefinition {\n return { name, type: 'TEXT' };\n }\n\n export function real(name: string): types.ColumnDefinition {\n return { name, type: 'REAL' };\n }\n\n export function blob(name: string): types.ColumnDefinition {\n return { name, type: 'BLOB' };\n }\n\n export function numeric(name: string): types.ColumnDefinition {\n return { name, type: 'NUMERIC' };\n }\n\n // ════════ Column Modifiers ════════\n export function primaryKey(col: types.ColumnDefinition, autoIncrement = false): types.ColumnDefinition {\n return { ...col, primaryKey: true, autoIncrement };\n }\n\n export function notNull(col: types.ColumnDefinition): types.ColumnDefinition {\n return { ...col, notNull: true };\n }\n\n export function unique(col: types.ColumnDefinition): types.ColumnDefinition {\n return { ...col, unique: true };\n }\n\n export function defaultValue(col: types.ColumnDefinition, value: types.SqlValue): types.ColumnDefinition {\n return { ...col, default: value };\n }\n\n export function references(col: types.ColumnDefinition, table: string, column: string): types.ColumnDefinition {\n return { ...col, references: { table, column } };\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@je-es/sdb",
3
+ "version": "0.0.1",
4
+ "description": "A lightweight, type-safe SQLite database wrapper for Bun with an elegant API and zero dependencies.",
5
+ "keywords": ["je-es", "server", "database"],
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/je-es/sdb#readme",
8
+ "bugs": {
9
+ "url": "https://github.com/je-es/sdb/issues"
10
+ },
11
+ "author": "Maysara <maysara.elshewehy@gmail.com>",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/je-es/sdb.git"
15
+ },
16
+ "type": "module",
17
+ "main": "./dist/main.js",
18
+ "types": "./dist/main.d.ts",
19
+ "files": ["dist"],
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/main.d.ts",
23
+ "import": "./dist/main.js",
24
+ "require": "./dist/main.js"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "build": "tsup",
29
+ "lint": "eslint src --ext .ts",
30
+ "test": "bun test"
31
+ },
32
+ "engines": {
33
+ "bun": ">=1.3.3"
34
+ },
35
+ "peerDependencies": {
36
+ "bun": ">=1.3.3"
37
+ },
38
+ "dependencies": {},
39
+ "devDependencies": {
40
+ "@eslint/js": "^9.34.0",
41
+ "@stylistic/eslint-plugin": "^5.3.1",
42
+ "@types/bun": "^1.3.3",
43
+ "@types/node": "^20.12.7",
44
+ "bun-plugin-dts": "^0.3.0",
45
+ "bun-types": "^1.1.38",
46
+ "ts-node": "^10.9.2",
47
+ "tsup": "^8.5.1",
48
+ "typescript": "^5.4.5",
49
+ "typescript-eslint": "^8.42.0"
50
+ }
51
+ }