@minejs/db 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,646 @@
1
+ <!-- ╔══════════════════════════════ BEG ══════════════════════════════╗ -->
2
+
3
+ <br>
4
+ <div align="center">
5
+ <p>
6
+ <img src="./assets/img/logo.png" alt="logo" style="" height="60" />
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/🔥-@minejs-black"/>
13
+ <img src="https://img.shields.io/badge/zero-dependencies-black" alt="Test Coverage" />
14
+ <br>
15
+ <img src="https://img.shields.io/badge/coverage-100%25-brightgreen" alt="Test Coverage" />
16
+ <img src="https://img.shields.io/github/issues/minejs-org/db?style=flat" alt="Github Repo Issues" />
17
+ <img src="https://img.shields.io/github/stars/minejs-org/db?style=social" alt="GitHub Repo stars" />
18
+ </div>
19
+ <br>
20
+
21
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
22
+
23
+
24
+
25
+ <!-- ╔══════════════════════════════ DOC ══════════════════════════════╗ -->
26
+
27
+ - ## Quick Start 🔥
28
+
29
+ > **_Lightweight SQLite database wrapper with fluent query builder and schema management._**
30
+
31
+ - ### Setup
32
+
33
+ > install [`space`](https://github.com/solution-lib/space) first.
34
+
35
+ ```bash
36
+ space i @minejs/db
37
+ ```
38
+
39
+ <div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
40
+
41
+ - ### Usage
42
+
43
+ ```ts
44
+ import { DB, table, column, primaryKey, integer, text, notNull, references, index } from '@minejs/db'
45
+ ```
46
+
47
+ - ### 1. Basic Database Setup
48
+
49
+ ```typescript
50
+ // Create in-memory database
51
+ const db = new DB()
52
+
53
+ // Or with file path
54
+ const db = new DB('./app.db')
55
+
56
+ // Define schema
57
+ db.defineSchema(table('users', [
58
+ primaryKey(integer('id'), true),
59
+ notNull(text('name')),
60
+ notNull(text('email'))
61
+ ]))
62
+ ```
63
+
64
+ - ### 2. CRUD Operations
65
+
66
+ ```typescript
67
+ // Insert
68
+ const userId = db.insert('users', {
69
+ name: 'John Doe',
70
+ email: 'john@example.com'
71
+ })
72
+
73
+ // Read
74
+ const user = db.findById('users', userId)
75
+ const users = db.all('users')
76
+ const admin = db.findOne('users', { name: 'John Doe' })
77
+
78
+ // Update
79
+ db.update('users', userId, { email: 'newemail@example.com' })
80
+
81
+ // Delete
82
+ db.delete('users', userId)
83
+ ```
84
+
85
+ - ### 3. Query Builder
86
+
87
+ ```typescript
88
+ const results = db.query()
89
+ .select(['id', 'name', 'email'])
90
+ .from('users')
91
+ .where({ column: 'email', operator: 'LIKE', value: '%@example.com' })
92
+ .orderBy('name', 'ASC')
93
+ .limit(10)
94
+ .execute()
95
+ ```
96
+
97
+ - ### 4. Schema with Foreign Keys
98
+
99
+ ```typescript
100
+ db.defineSchema(table('posts', [
101
+ primaryKey(integer('id'), true),
102
+ integer('userId'),
103
+ references(
104
+ column('userId'),
105
+ 'users',
106
+ 'id',
107
+ { onDelete: 'CASCADE' }
108
+ ),
109
+ text('title'),
110
+ text('content')
111
+ ]))
112
+ ```
113
+
114
+ - ### 5. Transactions
115
+
116
+ ```typescript
117
+ db.transaction(() => {
118
+ db.insert('users', { name: 'Jane', email: 'jane@example.com' })
119
+ db.insert('posts', { userId: 1, title: 'First Post', content: 'Content' })
120
+ // All succeed or all rollback
121
+ })
122
+ ```
123
+
124
+ - ### 6. Indexes
125
+
126
+ ```typescript
127
+ db.defineSchema(table('users', [
128
+ primaryKey(integer('id'), true),
129
+ notNull(text('email')),
130
+ index('idx_email', 'email', true) // unique index
131
+ ]))
132
+ ```
133
+
134
+ <br>
135
+
136
+ - ## API Reference 🔥
137
+
138
+ - #### `new DB(path?: string): DB`
139
+ > Create a database instance.
140
+
141
+ ```typescript
142
+ // In-memory database (default)
143
+ const db = new DB()
144
+
145
+ // Or with file path
146
+ const db = new DB('./data/app.db')
147
+ ```
148
+
149
+ - #### `DB.defineSchema(schema: TableSchema): void`
150
+
151
+ > Define a table schema.
152
+
153
+ ```typescript
154
+ import { table, column, primaryKey, integer, text, notNull } from '@minejs/db'
155
+
156
+ db.defineSchema(table('users', [
157
+ primaryKey(integer('id'), true),
158
+ notNull(text('name')),
159
+ notNull(text('email'))
160
+ ]))
161
+ ```
162
+
163
+ - #### `DB.getSchema(tableName: string): TableSchema | undefined`
164
+
165
+ > Retrieve schema definition for a table.
166
+
167
+ ```typescript
168
+ const schema = db.getSchema('users')
169
+ console.log(schema.columns)
170
+ ```
171
+
172
+ - #### `DB.listTables(): string[]`
173
+
174
+ > Get list of all tables in database.
175
+
176
+ ```typescript
177
+ const tables = db.listTables()
178
+ console.log(tables) // ['users', 'posts', ...]
179
+ ```
180
+
181
+ - #### `DB.dropTable(tableName: string): void`
182
+
183
+ > Drop a table from database.
184
+
185
+ ```typescript
186
+ db.dropTable('users')
187
+ ```
188
+
189
+ - #### `DB.insert(table: string, data: Record<string, SqlValue>): unknown`
190
+
191
+ > Insert a new record.
192
+
193
+ ```typescript
194
+ const id = db.insert('users', {
195
+ name: 'John',
196
+ email: 'john@example.com'
197
+ })
198
+ ```
199
+
200
+ - #### `DB.findById(table: string, id: number | string): unknown | null`
201
+
202
+ > Find record by ID.
203
+
204
+ ```typescript
205
+ const user = db.findById('users', 1)
206
+ ```
207
+
208
+ - #### `DB.findOne(table: string, conditions: Record<string, SqlValue>): unknown | null`
209
+
210
+ > Find first matching record.
211
+
212
+ ```typescript
213
+ const user = db.findOne('users', { email: 'john@example.com' })
214
+ ```
215
+
216
+ - #### `DB.find(table: string, conditions: Record<string, SqlValue>): unknown[]`
217
+
218
+ > Find all matching records.
219
+
220
+ ```typescript
221
+ const users = db.find('users', { status: 'active' })
222
+ ```
223
+
224
+ - #### `DB.all(table: string): unknown[]`
225
+
226
+ > Get all records from table.
227
+
228
+ ```typescript
229
+ const allUsers = db.all('users')
230
+ ```
231
+
232
+ - #### `DB.update(table: string, id: number | string, data: Record<string, SqlValue>): unknown | null`
233
+
234
+ > Update a record by ID.
235
+
236
+ ```typescript
237
+ const updated = db.update('users', 1, {
238
+ email: 'newemail@example.com'
239
+ })
240
+ ```
241
+
242
+ - #### `DB.delete(table: string, id: number | string): boolean`
243
+
244
+ > Delete a record by ID.
245
+
246
+ ```typescript
247
+ const success = db.delete('users', 1)
248
+ ```
249
+
250
+ - #### `DB.query(): QueryBuilder`
251
+
252
+ > Create a query builder for advanced queries.
253
+
254
+ ```typescript
255
+ const results = db.query()
256
+ .select(['id', 'name'])
257
+ .from('users')
258
+ .where({ column: 'age', operator: '>', value: 18 })
259
+ .orderBy('name', 'ASC')
260
+ .limit(10)
261
+ .execute()
262
+ ```
263
+
264
+ - #### `DB.transaction(callback: (db: DB) => void): void`
265
+
266
+ > Execute operations in a transaction.
267
+
268
+ ```typescript
269
+ db.transaction(() => {
270
+ db.insert('users', { name: 'Alice' })
271
+ db.insert('posts', { userId: 1, title: 'Welcome' })
272
+ })
273
+ ```
274
+
275
+ - #### `DB.exec(sql: string): void`
276
+
277
+ > Execute raw SQL statement.
278
+
279
+ ```typescript
280
+ db.exec('DELETE FROM users WHERE age < 18')
281
+ ```
282
+
283
+ - #### `DB.raw(sql: string, params?: SqlValue[]): unknown[]`
284
+
285
+ > Execute raw SQL query with parameters.
286
+
287
+ ```typescript
288
+ const users = db.raw(
289
+ 'SELECT * FROM users WHERE age > ? ORDER BY name',
290
+ [18]
291
+ )
292
+ ```
293
+
294
+ - #### `DB.rawOne(sql: string, params?: SqlValue[]): unknown | null`
295
+
296
+ > Execute raw SQL query returning single result.
297
+
298
+ ```typescript
299
+ const user = db.rawOne(
300
+ 'SELECT * FROM users WHERE email = ?',
301
+ ['john@example.com']
302
+ )
303
+ ```
304
+
305
+ - #### `DB.close(): void`
306
+
307
+ > Close database connection.
308
+
309
+ ```typescript
310
+ db.close()
311
+ ```
312
+
313
+ - #### `QueryBuilder`
314
+
315
+ > Fluent interface for building queries.
316
+
317
+ ```typescript
318
+ interface QueryBuilder {
319
+ select(columns?: string[]): QueryBuilder
320
+ from(table: string): QueryBuilder
321
+ where(condition: WhereCondition | WhereCondition[]): QueryBuilder
322
+ and(condition: WhereCondition): QueryBuilder
323
+ or(condition: WhereCondition): QueryBuilder
324
+ orderBy(column: string, direction?: 'ASC' | 'DESC'): QueryBuilder
325
+ limit(count: number): QueryBuilder
326
+ offset(count: number): QueryBuilder
327
+ insert(table: string, data: Record<string, SqlValue>): QueryBuilder
328
+ update(table: string, data: Record<string, SqlValue>): QueryBuilder
329
+ delete(table: string): QueryBuilder
330
+ execute(): unknown[]
331
+ executeOne(): unknown | null
332
+ raw(sql: string, params?: SqlValue[]): QueryBuilder
333
+ }
334
+ ```
335
+
336
+ - #### `table(name: string, columns: ColumnDefinition[]): TableSchema`
337
+
338
+ > Create a table schema definition.
339
+
340
+ ```typescript
341
+ const usersSchema = table('users', [
342
+ primaryKey(integer('id'), true),
343
+ notNull(text('name'))
344
+ ])
345
+ ```
346
+
347
+ - #### `column(name: string, type: ColumnType): ColumnDefinition`
348
+
349
+ > Define a column.
350
+
351
+ ```typescript
352
+ const nameCol = column('name', 'TEXT')
353
+ ```
354
+
355
+ - #### `integer(name: string): ColumnDefinition`
356
+
357
+ > Create INTEGER column.
358
+
359
+ ```typescript
360
+ const ageCol = integer('age')
361
+ ```
362
+
363
+ - #### `text(name: string): ColumnDefinition`
364
+
365
+ > Create TEXT column.
366
+
367
+ ```typescript
368
+ const nameCol = text('name')
369
+ ```
370
+
371
+ - #### `real(name: string): ColumnDefinition`
372
+
373
+ > Create REAL (float) column.
374
+
375
+ ```typescript
376
+ const priceCol = real('price')
377
+ ```
378
+
379
+ - #### `blob(name: string): ColumnDefinition`
380
+
381
+ > Create BLOB (binary) column.
382
+
383
+ ```typescript
384
+ const dataCol = blob('data')
385
+ ```
386
+
387
+ - #### `numeric(name: string): ColumnDefinition`
388
+
389
+ > Create NUMERIC column.
390
+
391
+ ```typescript
392
+ const idCol = numeric('id')
393
+ ```
394
+
395
+ - #### `primaryKey(col: ColumnDefinition, autoIncrement?: boolean): ColumnDefinition`
396
+
397
+ > Add primary key constraint.
398
+
399
+ ```typescript
400
+ const idCol = primaryKey(integer('id'), true) // auto-increment
401
+ ```
402
+
403
+ - #### `notNull(col: ColumnDefinition): ColumnDefinition`
404
+
405
+ > Add NOT NULL constraint.
406
+
407
+ ```typescript
408
+ const nameCol = notNull(text('name'))
409
+ ```
410
+
411
+ - #### `unique(col: ColumnDefinition): ColumnDefinition`
412
+
413
+ > Add UNIQUE constraint to single column.
414
+
415
+ ```typescript
416
+ const emailCol = unique(text('email'))
417
+ ```
418
+
419
+ - #### `unique(columns: string[]): UniqueConstraint`
420
+
421
+ > Create composite UNIQUE constraint.
422
+
423
+ ```typescript
424
+ unique(['email', 'provider'])
425
+ ```
426
+
427
+ - #### `defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition`
428
+
429
+ > Set column default value.
430
+
431
+ ```typescript
432
+ const statusCol = defaultValue(text('status'), 'active')
433
+ ```
434
+
435
+ - #### `references(col: ColumnDefinition, table: string, column: string, options?: ForeignKeyOptions): ColumnDefinition`
436
+
437
+ > Add foreign key constraint.
438
+
439
+ ```typescript
440
+ const userIdCol = references(
441
+ integer('userId'),
442
+ 'users',
443
+ 'id',
444
+ { onDelete: 'CASCADE', onUpdate: 'CASCADE' }
445
+ )
446
+ ```
447
+
448
+ - #### `index(name: string, columns: string | string[], unique?: boolean): IndexDefinition`
449
+
450
+ > Create index on columns.
451
+
452
+ ```typescript
453
+ index('idx_email', 'email') // single column
454
+ index('idx_user_post', ['userId', 'postId']) // composite
455
+ index('idx_email_unique', 'email', true) // unique index
456
+ ```
457
+
458
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
459
+
460
+
461
+
462
+ <!-- ╔══════════════════════════════ END ══════════════════════════════╗ -->
463
+
464
+ - ## Real-World Examples
465
+
466
+ - #### Blog Application Schema
467
+
468
+ ```typescript
469
+ import { DB, table, column, primaryKey, integer, text, notNull, references, unique, index } from '@minejs/db'
470
+
471
+ const db = new DB('./blog.db')
472
+
473
+ // Users table
474
+ db.defineSchema(table('users', [
475
+ primaryKey(integer('id'), true),
476
+ notNull(unique(text('email'))),
477
+ notNull(text('name')),
478
+ text('avatar'),
479
+ index('idx_email', 'email')
480
+ ]))
481
+
482
+ // Posts table
483
+ db.defineSchema(table('posts', [
484
+ primaryKey(integer('id'), true),
485
+ integer('userId'),
486
+ references(
487
+ column('userId'),
488
+ 'users',
489
+ 'id',
490
+ { onDelete: 'CASCADE' }
491
+ ),
492
+ notNull(text('title')),
493
+ notNull(text('content')),
494
+ text('slug'),
495
+ index('idx_user_posts', ['userId', 'id'])
496
+ ]))
497
+
498
+ // Comments table
499
+ db.defineSchema(table('comments', [
500
+ primaryKey(integer('id'), true),
501
+ integer('postId'),
502
+ integer('userId'),
503
+ references(column('postId'), 'posts', 'id', { onDelete: 'CASCADE' }),
504
+ references(column('userId'), 'users', 'id', { onDelete: 'CASCADE' }),
505
+ notNull(text('content'))
506
+ ]))
507
+ ```
508
+
509
+ - #### CRUD Operations
510
+
511
+ ```typescript
512
+ // Create user
513
+ const userId = db.insert('users', {
514
+ email: 'john@example.com',
515
+ name: 'John Doe'
516
+ })
517
+
518
+ // Create post
519
+ const postId = db.insert('posts', {
520
+ userId: userId,
521
+ title: 'My First Post',
522
+ content: 'This is amazing!',
523
+ slug: 'my-first-post'
524
+ })
525
+
526
+ // Find user
527
+ const user = db.findById('users', userId)
528
+
529
+ // Find user's posts
530
+ const userPosts = db.find('posts', { userId: userId })
531
+
532
+ // Update post
533
+ db.update('posts', postId, {
534
+ title: 'Updated Title'
535
+ })
536
+
537
+ // Delete comment
538
+ db.delete('comments', commentId)
539
+ ```
540
+
541
+ - #### Advanced Queries
542
+
543
+ ```typescript
544
+ // Find all posts ordered by creation
545
+ const recentPosts = db.query()
546
+ .select(['id', 'title', 'userId'])
547
+ .from('posts')
548
+ .orderBy('id', 'DESC')
549
+ .limit(10)
550
+ .execute()
551
+
552
+ // Find posts by specific user with pagination
553
+ const page1 = db.query()
554
+ .select('*')
555
+ .from('posts')
556
+ .where({ column: 'userId', operator: '=', value: userId })
557
+ .orderBy('id', 'DESC')
558
+ .limit(20)
559
+ .offset(0)
560
+ .execute()
561
+
562
+ // Count posts using raw SQL
563
+ const count = db.raw('SELECT COUNT(*) as total FROM posts')[0]
564
+ ```
565
+
566
+ - #### Transactions
567
+
568
+ ```typescript
569
+ db.transaction(() => {
570
+ // Create user
571
+ const userId = db.insert('users', {
572
+ email: 'jane@example.com',
573
+ name: 'Jane Smith'
574
+ })
575
+
576
+ // Create multiple posts
577
+ db.insert('posts', {
578
+ userId: userId,
579
+ title: 'First Post',
580
+ content: 'Welcome!'
581
+ })
582
+
583
+ db.insert('posts', {
584
+ userId: userId,
585
+ title: 'Second Post',
586
+ content: 'Another one'
587
+ })
588
+
589
+ // If any operation fails, all rollback
590
+ })
591
+ ```
592
+
593
+ - #### Schema Inspection
594
+
595
+ ```typescript
596
+ // Get all tables
597
+ const tables = db.listTables()
598
+ console.log(tables) // ['users', 'posts', 'comments']
599
+
600
+ // Get table schema
601
+ const schema = db.getSchema('users')
602
+ console.log(schema.name) // 'users'
603
+ console.log(schema.columns) // [...]
604
+
605
+ // Drop table
606
+ db.dropTable('comments')
607
+ ```
608
+
609
+ - #### Raw SQL for Complex Queries
610
+
611
+ ```typescript
612
+ // Join query
613
+ const postsWithAuthors = db.raw(`
614
+ SELECT
615
+ p.id,
616
+ p.title,
617
+ u.name as author
618
+ FROM posts p
619
+ JOIN users u ON p.userId = u.id
620
+ WHERE u.id = ?
621
+ ORDER BY p.id DESC
622
+ `, [userId])
623
+
624
+ // Aggregation
625
+ const stats = db.raw(`
626
+ SELECT
627
+ u.name,
628
+ COUNT(p.id) as post_count,
629
+ COUNT(c.id) as comment_count
630
+ FROM users u
631
+ LEFT JOIN posts p ON u.id = p.userId
632
+ LEFT JOIN comments c ON p.id = c.postId
633
+ GROUP BY u.id
634
+ HAVING post_count > ?
635
+ `, [5])
636
+ ```
637
+
638
+ <br>
639
+
640
+ ---
641
+
642
+ <div align="center">
643
+ <a href="https://github.com/maysara-elshewehy"><img src="https://img.shields.io/badge/by-Maysara-black"/></a>
644
+ </div>
645
+
646
+ <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
package/dist/main.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var bun_sqlite=require('bun:sqlite');var a=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);}for(let e of t.columns)if(e&&typeof e=="object"&&"_type"in e&&e._type==="index"){let s=e,n=`CREATE ${s.unique?"UNIQUE":""} INDEX IF NOT EXISTS ${s.name} ON ${t.name} (${s.columns.join(", ")})`;this.db.exec(n);}}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 o=n.value.map(()=>"?").join(", ");return n.value.forEach(l=>{r.currentParams.push(l);}),`${n.column} IN (${o})`}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),o=Object.values(this._insertData);if(n.length===0)e=`INSERT INTO ${this._from} DEFAULT VALUES`,r.currentParams=[];else {let l=n.map(()=>"?").join(", ");e=`INSERT INTO ${this._from} (${n.join(", ")}) VALUES (${l})`,r.currentParams=o;}}else if(this._isUpdate&&this._updateData){let n=Object.keys(this._updateData).map(l=>`${l} = ?`),o=Object.values(this._updateData);if(r.currentParams=[...o,...r.currentParams],e=`UPDATE ${this._from} SET ${n.join(", ")}`,this._where.length>0){let l=this.buildWhereClause();e+=` WHERE ${l}`;}}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=[],e=[];for(let u of t.columns){if(!u||typeof u!="object"||!("name"in u)){if(u&&"_type"in u&&u._type==="unique"){let l=u;e.push(`UNIQUE (${l.columns.join(", ")})`);}continue}let n=u,o=`${n.name} ${n.type}`;n.primaryKey&&(o+=" PRIMARY KEY",n.autoIncrement&&(o+=" AUTOINCREMENT")),n.notNull&&!n.primaryKey&&(o+=" NOT NULL"),n.unique&&(o+=" UNIQUE"),n.default!==void 0&&(typeof n.default=="string"?o+=` DEFAULT '${n.default}'`:n.default===null?o+=" DEFAULT NULL":o+=` DEFAULT ${n.default}`),n.references&&(o+=` REFERENCES ${n.references.table}(${n.references.column})`,n.references.options&&(n.references.options.onDelete&&(o+=` ON DELETE ${n.references.options.onDelete}`),n.references.options.onUpdate&&(o+=` ON UPDATE ${n.references.options.onUpdate}`))),r.push(o);}let s=[...r,...e];return `CREATE TABLE IF NOT EXISTS ${t.name} (${s.join(", ")})`}};function c(i,t){return {name:i,columns:t}}function f(i,t){return {name:i,type:t}}function h(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 E(i){return {name:i,type:"NUMERIC"}}function _(i,t=false){return {...i,primaryKey:true,autoIncrement:t}}function C(i){return {...i,notNull:true}}function D(i){return Array.isArray(i)?{_type:"unique",columns:i}:{...i,unique:true}}function S(i,t){return {...i,default:t}}function w(i,t,r,e){return {...i,references:{table:t,column:r,options:e}}}function b(i,t,r){return {_type:"index",name:i,columns:Array.isArray(t)?t:[t],unique:r}}exports.DB=a;exports.blob=g;exports.column=f;exports.defaultValue=S;exports.index=b;exports.integer=h;exports.notNull=C;exports.numeric=E;exports.primaryKey=_;exports.real=d;exports.references=w;exports.table=c;exports.text=m;exports.unique=D;//# 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","col","indexDef","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","updateValues","whereClause","result","parts","i","results","columnDefs","uniqueConstraints","uniqueCol","columnCol","def","allDefs","name","type","integer","text","real","blob","numeric","primaryKey","autoIncrement","notNull","unique","defaultValue","references","options"],"mappings":"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","file":"main.cjs","sourcesContent":["// src/main.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Database } from 'bun:sqlite';\r\n import * as types from './types.d';\r\n export * from './types.d';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class DB {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private db : Database;\r\n private schemas : Map<string, types.TableSchema>;\r\n private currentQuery : string = '';\r\n private currentParams : types.SqlValue[] = [];\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── CORE ──────────────────────────────┐\r\n\r\n constructor(path: string = ':memory:') {\r\n this.schemas = new Map;\r\n this.db = new Database(path);\r\n this.db.exec('PRAGMA foreign_keys = ON');\r\n }\r\n\r\n close(): void {\r\n this.db.close();\r\n }\r\n\r\n // ════════ Schema Management ════════\r\n defineSchema(schema: types.TableSchema): void {\r\n this.schemas.set(schema.name, schema);\r\n const sql = this.generateCreateTableSQL(schema);\r\n this.db.exec(sql);\r\n\r\n // Create indexes from schema.indexes\r\n if (schema.indexes) {\r\n for (const index of schema.indexes) {\r\n const uniqueStr = index.unique ? 'UNIQUE' : '';\r\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${index.name} ON ${schema.name} (${index.columns.join(', ')})`;\r\n this.db.exec(indexSql);\r\n }\r\n }\r\n\r\n // Create indexes from columns array (from index() helper)\r\n for (const col of schema.columns) {\r\n if (col && typeof col === 'object' && '_type' in col && col._type === 'index') {\r\n const indexDef = col as types.IndexDefinition;\r\n const uniqueStr = indexDef.unique ? 'UNIQUE' : '';\r\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${indexDef.name} ON ${schema.name} (${indexDef.columns.join(', ')})`;\r\n this.db.exec(indexSql);\r\n }\r\n }\r\n }\r\n\r\n getSchema(tableName: string): types.TableSchema | undefined {\r\n return this.schemas.get(tableName);\r\n }\r\n\r\n listTables(): string[] {\r\n const result = this.db.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").all();\r\n return result.map((r: unknown) => (r as types.TableRow).name);\r\n }\r\n\r\n dropTable(tableName: string): void {\r\n this.db.exec(`DROP TABLE IF EXISTS ${tableName}`);\r\n this.schemas.delete(tableName);\r\n }\r\n\r\n // ════════ Query Builder ════════\r\n query(): types.QueryBuilder {\r\n this.reset();\r\n return this.createQueryBuilder();\r\n }\r\n\r\n // ════════ Quick Operations ════════\r\n find(table: string, conditions: Record<string, types.SqlValue>): unknown[] {\r\n const whereConditions: types.WhereCondition[] = Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n }));\r\n\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(whereConditions)\r\n .execute();\r\n }\r\n\r\n findOne(table: string, conditions: Record<string, types.SqlValue>): unknown | null {\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n })))\r\n .limit(1)\r\n .executeOne();\r\n }\r\n\r\n findById(table: string, id: number | string): unknown | null {\r\n return this.findOne(table, { id });\r\n }\r\n\r\n all(table: string): unknown[] {\r\n return this.query().select().from(table).execute();\r\n }\r\n\r\n insert(table: string, data: Record<string, types.SqlValue>): unknown {\r\n this.query().insert(table, data).execute();\r\n\r\n // Return inserted row\r\n const lastId = this.db.query('SELECT last_insert_rowid() as id').get() as types.LastIdRow;\r\n return this.findById(table, lastId.id);\r\n }\r\n\r\n update(table: string, id: number | string, data: Record<string, types.SqlValue>): unknown | null {\r\n this.query()\r\n .update(table, data)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute();\r\n\r\n return this.findById(table, id);\r\n }\r\n\r\n delete(table: string, id: number | string): boolean {\r\n this.query()\r\n .delete(table)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute();\r\n\r\n return true;\r\n }\r\n\r\n // ════════ Transactions ════════\r\n transaction(callback: (db: DB) => void): void {\r\n this.db.exec('BEGIN TRANSACTION');\r\n try {\r\n callback(this);\r\n this.db.exec('COMMIT');\r\n } catch (error) {\r\n this.db.exec('ROLLBACK');\r\n throw error;\r\n }\r\n }\r\n\r\n // ════════ Raw SQL ════════\r\n exec(sql: string): void {\r\n this.db.exec(sql);\r\n }\r\n\r\n raw(sql: string, params: types.SqlValue[] = []): unknown[] {\r\n const stmt = this.db.query(sql);\r\n return stmt.all(...params) as unknown[];\r\n }\r\n\r\n rawOne(sql: string, params: types.SqlValue[] = []): unknown | null {\r\n const stmt = this.db.query(sql);\r\n return stmt.get(...params) as unknown | null;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private reset(): void {\r\n this.currentQuery = '';\r\n this.currentParams = [];\r\n }\r\n\r\n private createQueryBuilder(): types.QueryBuilder {\r\n const builder: types.QueryBuilderInternal & Partial<types.QueryBuilder> & { buildWhereClause?: () => string } = {\r\n _select: ['*'],\r\n _from: '',\r\n _where: [],\r\n _orderBy: '',\r\n _limit: null,\r\n _offset: null,\r\n _isInsert: false,\r\n _isUpdate: false,\r\n _isDelete: false,\r\n _insertData: null,\r\n _updateData: null\r\n };\r\n\r\n // Bind methods to this DB instance\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const self = this;\r\n\r\n builder.select = function(columns?: string[]): types.QueryBuilder {\r\n this._select = columns || ['*'];\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.from = function(table: string): types.QueryBuilder {\r\n this._from = table;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.where = function(condition: types.WhereCondition | types.WhereCondition[]): types.QueryBuilder {\r\n const conditions = Array.isArray(condition) ? condition : [condition];\r\n\r\n const whereClauses = conditions.map(cond => {\r\n if (cond.operator === 'IS NULL' || cond.operator === 'IS NOT NULL') {\r\n return `${cond.column} ${cond.operator}`;\r\n } else if (cond.operator === 'IN' && Array.isArray(cond.value)) {\r\n const placeholders = cond.value.map(() => '?').join(', ');\r\n // Spread array values into params\r\n cond.value.forEach(val => {\r\n self.currentParams.push(val as types.SqlValue);\r\n });\r\n return `${cond.column} IN (${placeholders})`;\r\n } else {\r\n self.currentParams.push(cond.value as types.SqlValue);\r\n return `${cond.column} ${cond.operator} ?`;\r\n }\r\n });\r\n\r\n this._where.push(...whereClauses);\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.and = function(condition: types.WhereCondition): types.QueryBuilder {\r\n return this.where!(condition);\r\n };\r\n\r\n builder.or = function(condition: types.WhereCondition): types.QueryBuilder {\r\n let clause = '';\r\n if (condition.operator === 'IS NULL' || condition.operator === 'IS NOT NULL') {\r\n clause = `${condition.column} ${condition.operator}`;\r\n } else if (condition.operator === 'IN' && Array.isArray(condition.value)) {\r\n const placeholders = condition.value.map(() => '?').join(', ');\r\n // Spread array values into params\r\n condition.value.forEach(val => {\r\n self.currentParams.push(val as types.SqlValue);\r\n });\r\n clause = `${condition.column} IN (${placeholders})`;\r\n } else {\r\n self.currentParams.push(condition.value as types.SqlValue);\r\n clause = `${condition.column} ${condition.operator} ?`;\r\n }\r\n\r\n // Add OR prefix to the clause itself\r\n this._where.push(`OR ${clause}`);\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.orderBy = function(column: string, direction: 'ASC' | 'DESC' = 'ASC'): types.QueryBuilder {\r\n this._orderBy = `ORDER BY ${column} ${direction}`;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.limit = function(count: number): types.QueryBuilder {\r\n this._limit = count;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.offset = function(count: number): types.QueryBuilder {\r\n this._offset = count;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.insert = function(table: string, data: Record<string, types.SqlValue>): types.QueryBuilder {\r\n this._isInsert = true;\r\n this._from = table;\r\n this._insertData = data;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.update = function(table: string, data: Record<string, types.SqlValue>): types.QueryBuilder {\r\n this._isUpdate = true;\r\n this._from = table;\r\n this._updateData = data;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.delete = function(table: string): types.QueryBuilder {\r\n this._isDelete = true;\r\n this._from = table;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.raw = function(sql: string, params: types.SqlValue[] = []): types.QueryBuilder {\r\n self.currentQuery = sql;\r\n self.currentParams = params;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.execute = function(): unknown[] {\r\n let sql = '';\r\n\r\n if (this._isInsert && this._insertData) {\r\n const columns = Object.keys(this._insertData);\r\n const values = Object.values(this._insertData);\r\n\r\n // Handle empty insert (all defaults)\r\n if (columns.length === 0) {\r\n sql = `INSERT INTO ${this._from} DEFAULT VALUES`;\r\n self.currentParams = [];\r\n } else {\r\n const placeholders = columns.map(() => '?').join(', ');\r\n sql = `INSERT INTO ${this._from} (${columns.join(', ')}) VALUES (${placeholders})`;\r\n self.currentParams = values;\r\n }\r\n } else if (this._isUpdate && this._updateData) {\r\n const setClauses = Object.keys(this._updateData).map(col => `${col} = ?`);\r\n const updateValues = Object.values(this._updateData);\r\n self.currentParams = [...updateValues, ...self.currentParams] as types.SqlValue[];\r\n sql = `UPDATE ${this._from} SET ${setClauses.join(', ')}`;\r\n\r\n if (this._where.length > 0) {\r\n // Build WHERE clause properly handling OR conditions\r\n const whereClause = this.buildWhereClause!();\r\n sql += ` WHERE ${whereClause}`;\r\n }\r\n } else if (this._isDelete) {\r\n sql = `DELETE FROM ${this._from}`;\r\n\r\n if (this._where.length > 0) {\r\n // Build WHERE clause properly handling OR conditions\r\n const whereClause = this.buildWhereClause!();\r\n sql += ` WHERE ${whereClause}`;\r\n }\r\n } else {\r\n // SELECT query or raw query\r\n if (self.currentQuery) {\r\n sql = self.currentQuery;\r\n } else {\r\n sql = `SELECT ${this._select.join(', ')} FROM ${this._from}`;\r\n\r\n if (this._where.length > 0) {\r\n // Build WHERE clause properly handling OR conditions\r\n const whereClause = this.buildWhereClause!();\r\n sql += ` WHERE ${whereClause}`;\r\n }\r\n\r\n if (this._orderBy) {\r\n sql += ` ${this._orderBy}`;\r\n }\r\n\r\n if (this._limit !== null) {\r\n sql += ` LIMIT ${this._limit}`;\r\n }\r\n\r\n // OFFSET requires LIMIT in SQLite\r\n if (this._offset !== null) {\r\n if (this._limit === null) {\r\n // Add a very large limit if offset is used without limit\r\n sql += ` LIMIT -1`;\r\n }\r\n sql += ` OFFSET ${this._offset}`;\r\n }\r\n }\r\n }\r\n\r\n const stmt = self.db.query(sql);\r\n const result = stmt.all(...self.currentParams) as unknown[];\r\n self.reset();\r\n return result;\r\n };\r\n\r\n builder.buildWhereClause = function(): string {\r\n const parts: string[] = [];\r\n for (let i = 0; i < this._where.length; i++) {\r\n const clause = this._where[i];\r\n if (clause.startsWith('OR ')) {\r\n parts.push('OR');\r\n parts.push(clause.substring(3)); // Remove 'OR ' prefix\r\n } else {\r\n if (i > 0 && !this._where[i - 1].startsWith('OR ')) {\r\n parts.push('AND');\r\n }\r\n parts.push(clause);\r\n }\r\n }\r\n return parts.join(' ');\r\n };\r\n\r\n builder.executeOne = function(): unknown | null {\r\n const results = this.execute!();\r\n return results.length > 0 ? results[0] : null;\r\n };\r\n\r\n builder.executeRaw = function(sql: string, params: types.SqlValue[] = []): unknown[] {\r\n const stmt = self.db.query(sql);\r\n const result = stmt.all(...params) as unknown[];\r\n return result;\r\n };\r\n\r\n return builder as types.QueryBuilder;\r\n }\r\n\r\n private generateCreateTableSQL(schema: types.TableSchema): string {\r\n const columnDefs: string[] = [];\r\n const uniqueConstraints: string[] = [];\r\n\r\n for (const col of schema.columns) {\r\n // Skip constraint definitions, they're handled separately\r\n if (!col || typeof col !== 'object' || !('name' in col)) {\r\n if (col && '_type' in col && col._type === 'unique') {\r\n const uniqueCol = col as types.UniqueConstraint;\r\n uniqueConstraints.push(`UNIQUE (${uniqueCol.columns.join(', ')})`);\r\n }\r\n continue;\r\n }\r\n\r\n const columnCol = col as types.ColumnDefinition;\r\n let def = `${columnCol.name} ${columnCol.type}`;\r\n\r\n if (columnCol.primaryKey) {\r\n def += ' PRIMARY KEY';\r\n if (columnCol.autoIncrement) {\r\n def += ' AUTOINCREMENT';\r\n }\r\n }\r\n\r\n if (columnCol.notNull && !columnCol.primaryKey) {\r\n def += ' NOT NULL';\r\n }\r\n\r\n if (columnCol.unique) {\r\n def += ' UNIQUE';\r\n }\r\n\r\n if (columnCol.default !== undefined) {\r\n if (typeof columnCol.default === 'string') {\r\n def += ` DEFAULT '${columnCol.default}'`;\r\n } else if (columnCol.default === null) {\r\n def += ' DEFAULT NULL';\r\n } else {\r\n def += ` DEFAULT ${columnCol.default}`;\r\n }\r\n }\r\n\r\n if (columnCol.references) {\r\n def += ` REFERENCES ${columnCol.references.table}(${columnCol.references.column})`;\r\n if (columnCol.references.options) {\r\n if (columnCol.references.options.onDelete) {\r\n def += ` ON DELETE ${columnCol.references.options.onDelete}`;\r\n }\r\n if (columnCol.references.options.onUpdate) {\r\n def += ` ON UPDATE ${columnCol.references.options.onUpdate}`;\r\n }\r\n }\r\n }\r\n\r\n columnDefs.push(def);\r\n }\r\n\r\n // Add unique constraints\r\n const allDefs = [...columnDefs, ...uniqueConstraints];\r\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${allDefs.join(', ')})`;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n // ════════ Schema Builder Helpers ════════\r\n export function table(name: string, columns: (types.ColumnDefinition | types.UniqueConstraint | types.IndexDefinition)[]): types.TableSchema {\r\n return { name, columns };\r\n }\r\n\r\n export function column(name: string, type: types.ColumnType): types.ColumnDefinition {\r\n return { name, type };\r\n }\r\n\r\n export function integer(name: string): types.ColumnDefinition {\r\n return { name, type: 'INTEGER' };\r\n }\r\n\r\n export function text(name: string): types.ColumnDefinition {\r\n return { name, type: 'TEXT' };\r\n }\r\n\r\n export function real(name: string): types.ColumnDefinition {\r\n return { name, type: 'REAL' };\r\n }\r\n\r\n export function blob(name: string): types.ColumnDefinition {\r\n return { name, type: 'BLOB' };\r\n }\r\n\r\n export function numeric(name: string): types.ColumnDefinition {\r\n return { name, type: 'NUMERIC' };\r\n }\r\n\r\n // ════════ Column Modifiers ════════\r\n export function primaryKey(col: types.ColumnDefinition, autoIncrement = false): types.ColumnDefinition {\r\n return { ...col, primaryKey: true, autoIncrement };\r\n }\r\n\r\n export function notNull(col: types.ColumnDefinition): types.ColumnDefinition {\r\n return { ...col, notNull: true };\r\n }\r\n\r\n export function unique(col: types.ColumnDefinition): types.ColumnDefinition;\r\n export function unique(columns: string[]): types.UniqueConstraint;\r\n export function unique(col: types.ColumnDefinition | string[]): types.ColumnDefinition | types.UniqueConstraint {\r\n // If it's an array, treat it as composite unique constraint\r\n if (Array.isArray(col)) {\r\n return { _type: 'unique', columns: col };\r\n }\r\n // Otherwise, it's a single column unique constraint\r\n return { ...col, unique: true };\r\n }\r\n\r\n export function defaultValue(col: types.ColumnDefinition, value: types.SqlValue): types.ColumnDefinition {\r\n return { ...col, default: value };\r\n }\r\n\r\n export function references(col: types.ColumnDefinition, table: string, column: string, options?: types.ForeignKeyOptions): types.ColumnDefinition {\r\n return { ...col, references: { table, column, options } };\r\n }\r\n\r\n export function index(name: string, columns: string | string[], unique?: boolean): types.IndexDefinition {\r\n return { _type: 'index', name, columns: Array.isArray(columns) ? columns : [columns], unique };\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
@@ -0,0 +1,134 @@
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 ForeignKeyOptions {
13
+ onDelete? : 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION' | 'SET DEFAULT';
14
+ onUpdate? : 'CASCADE' | 'RESTRICT' | 'NO ACTION' | 'SET DEFAULT';
15
+ }
16
+
17
+ interface ColumnDefinition {
18
+ name : string;
19
+ type : ColumnType;
20
+ primaryKey? : boolean;
21
+ autoIncrement? : boolean;
22
+ notNull? : boolean;
23
+ unique? : boolean;
24
+ default? : SqlValue;
25
+ references? : { table: string; column: string; options?: ForeignKeyOptions };
26
+ }
27
+
28
+ interface UniqueConstraint {
29
+ _type : 'unique';
30
+ columns : string[];
31
+ }
32
+
33
+ interface IndexDefinition {
34
+ _type : 'index';
35
+ name : string;
36
+ columns : string[];
37
+ unique? : boolean;
38
+ }
39
+
40
+ interface TableSchema {
41
+ name : string;
42
+ columns : (ColumnDefinition | UniqueConstraint | IndexDefinition)[];
43
+ indexes? : { name: string; columns: string[]; unique?: boolean }[];
44
+ }
45
+
46
+ interface WhereCondition {
47
+ column : string;
48
+ operator : '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'IN' | 'IS NULL' | 'IS NOT NULL';
49
+ value? : SqlValue | SqlValue[];
50
+ }
51
+
52
+ interface QueryBuilder {
53
+ select : (columns?: string[]) => QueryBuilder;
54
+ from : (table: string) => QueryBuilder;
55
+ where : (condition: WhereCondition | WhereCondition[]) => QueryBuilder;
56
+ and : (condition: WhereCondition) => QueryBuilder;
57
+ or : (condition: WhereCondition) => QueryBuilder;
58
+ orderBy : (column: string, direction?: 'ASC' | 'DESC') => QueryBuilder;
59
+ limit : (count: number) => QueryBuilder;
60
+ offset : (count: number) => QueryBuilder;
61
+ insert : (table: string, data: Record<string, SqlValue>) => QueryBuilder;
62
+ update : (table: string, data: Record<string, SqlValue>) => QueryBuilder;
63
+ delete : (table: string) => QueryBuilder;
64
+ execute : () => unknown[];
65
+ executeOne : () => unknown | null;
66
+ executeRaw : (sql: string, params?: SqlValue[]) => unknown[];
67
+ raw : (sql: string, params?: SqlValue[]) => QueryBuilder;
68
+ }
69
+
70
+ interface TableRow {
71
+ name : string;
72
+ }
73
+
74
+ interface LastIdRow {
75
+ id : number | string;
76
+ }
77
+
78
+ interface QueryBuilderInternal {
79
+ _select : string[];
80
+ _from : string;
81
+ _where : string[];
82
+ _orderBy : string;
83
+ _limit : number | null;
84
+ _offset : number | null;
85
+ _isInsert : boolean;
86
+ _isUpdate : boolean;
87
+ _isDelete : boolean;
88
+ _insertData : Record<string, SqlValue> | null;
89
+ _updateData : Record<string, SqlValue> | null;
90
+ }
91
+
92
+ declare class DB {
93
+ private db;
94
+ private schemas;
95
+ private currentQuery;
96
+ private currentParams;
97
+ constructor(path?: string);
98
+ close(): void;
99
+ defineSchema(schema: TableSchema): void;
100
+ getSchema(tableName: string): TableSchema | undefined;
101
+ listTables(): string[];
102
+ dropTable(tableName: string): void;
103
+ query(): QueryBuilder;
104
+ find(table: string, conditions: Record<string, SqlValue>): unknown[];
105
+ findOne(table: string, conditions: Record<string, SqlValue>): unknown | null;
106
+ findById(table: string, id: number | string): unknown | null;
107
+ all(table: string): unknown[];
108
+ insert(table: string, data: Record<string, SqlValue>): unknown;
109
+ update(table: string, id: number | string, data: Record<string, SqlValue>): unknown | null;
110
+ delete(table: string, id: number | string): boolean;
111
+ transaction(callback: (db: DB) => void): void;
112
+ exec(sql: string): void;
113
+ raw(sql: string, params?: SqlValue[]): unknown[];
114
+ rawOne(sql: string, params?: SqlValue[]): unknown | null;
115
+ private reset;
116
+ private createQueryBuilder;
117
+ private generateCreateTableSQL;
118
+ }
119
+ declare function table(name: string, columns: (ColumnDefinition | UniqueConstraint | IndexDefinition)[]): TableSchema;
120
+ declare function column(name: string, type: ColumnType): ColumnDefinition;
121
+ declare function integer(name: string): ColumnDefinition;
122
+ declare function text(name: string): ColumnDefinition;
123
+ declare function real(name: string): ColumnDefinition;
124
+ declare function blob(name: string): ColumnDefinition;
125
+ declare function numeric(name: string): ColumnDefinition;
126
+ declare function primaryKey(col: ColumnDefinition, autoIncrement?: boolean): ColumnDefinition;
127
+ declare function notNull(col: ColumnDefinition): ColumnDefinition;
128
+ declare function unique(col: ColumnDefinition): ColumnDefinition;
129
+ declare function unique(columns: string[]): UniqueConstraint;
130
+ declare function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition;
131
+ declare function references(col: ColumnDefinition, table: string, column: string, options?: ForeignKeyOptions): ColumnDefinition;
132
+ declare function index(name: string, columns: string | string[], unique?: boolean): IndexDefinition;
133
+
134
+ export { type ColumnDefinition, type ColumnType, DB, type ForeignKeyOptions, type IndexDefinition, type LastIdRow, type QueryBuilder, type QueryBuilderInternal, type SqlValue, type TableRow, type TableSchema, type UniqueConstraint, type WhereCondition, blob, column, defaultValue, index, integer, notNull, numeric, primaryKey, real, references, table, text, unique };
package/dist/main.d.ts ADDED
@@ -0,0 +1,134 @@
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 ForeignKeyOptions {
13
+ onDelete? : 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION' | 'SET DEFAULT';
14
+ onUpdate? : 'CASCADE' | 'RESTRICT' | 'NO ACTION' | 'SET DEFAULT';
15
+ }
16
+
17
+ interface ColumnDefinition {
18
+ name : string;
19
+ type : ColumnType;
20
+ primaryKey? : boolean;
21
+ autoIncrement? : boolean;
22
+ notNull? : boolean;
23
+ unique? : boolean;
24
+ default? : SqlValue;
25
+ references? : { table: string; column: string; options?: ForeignKeyOptions };
26
+ }
27
+
28
+ interface UniqueConstraint {
29
+ _type : 'unique';
30
+ columns : string[];
31
+ }
32
+
33
+ interface IndexDefinition {
34
+ _type : 'index';
35
+ name : string;
36
+ columns : string[];
37
+ unique? : boolean;
38
+ }
39
+
40
+ interface TableSchema {
41
+ name : string;
42
+ columns : (ColumnDefinition | UniqueConstraint | IndexDefinition)[];
43
+ indexes? : { name: string; columns: string[]; unique?: boolean }[];
44
+ }
45
+
46
+ interface WhereCondition {
47
+ column : string;
48
+ operator : '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'IN' | 'IS NULL' | 'IS NOT NULL';
49
+ value? : SqlValue | SqlValue[];
50
+ }
51
+
52
+ interface QueryBuilder {
53
+ select : (columns?: string[]) => QueryBuilder;
54
+ from : (table: string) => QueryBuilder;
55
+ where : (condition: WhereCondition | WhereCondition[]) => QueryBuilder;
56
+ and : (condition: WhereCondition) => QueryBuilder;
57
+ or : (condition: WhereCondition) => QueryBuilder;
58
+ orderBy : (column: string, direction?: 'ASC' | 'DESC') => QueryBuilder;
59
+ limit : (count: number) => QueryBuilder;
60
+ offset : (count: number) => QueryBuilder;
61
+ insert : (table: string, data: Record<string, SqlValue>) => QueryBuilder;
62
+ update : (table: string, data: Record<string, SqlValue>) => QueryBuilder;
63
+ delete : (table: string) => QueryBuilder;
64
+ execute : () => unknown[];
65
+ executeOne : () => unknown | null;
66
+ executeRaw : (sql: string, params?: SqlValue[]) => unknown[];
67
+ raw : (sql: string, params?: SqlValue[]) => QueryBuilder;
68
+ }
69
+
70
+ interface TableRow {
71
+ name : string;
72
+ }
73
+
74
+ interface LastIdRow {
75
+ id : number | string;
76
+ }
77
+
78
+ interface QueryBuilderInternal {
79
+ _select : string[];
80
+ _from : string;
81
+ _where : string[];
82
+ _orderBy : string;
83
+ _limit : number | null;
84
+ _offset : number | null;
85
+ _isInsert : boolean;
86
+ _isUpdate : boolean;
87
+ _isDelete : boolean;
88
+ _insertData : Record<string, SqlValue> | null;
89
+ _updateData : Record<string, SqlValue> | null;
90
+ }
91
+
92
+ declare class DB {
93
+ private db;
94
+ private schemas;
95
+ private currentQuery;
96
+ private currentParams;
97
+ constructor(path?: string);
98
+ close(): void;
99
+ defineSchema(schema: TableSchema): void;
100
+ getSchema(tableName: string): TableSchema | undefined;
101
+ listTables(): string[];
102
+ dropTable(tableName: string): void;
103
+ query(): QueryBuilder;
104
+ find(table: string, conditions: Record<string, SqlValue>): unknown[];
105
+ findOne(table: string, conditions: Record<string, SqlValue>): unknown | null;
106
+ findById(table: string, id: number | string): unknown | null;
107
+ all(table: string): unknown[];
108
+ insert(table: string, data: Record<string, SqlValue>): unknown;
109
+ update(table: string, id: number | string, data: Record<string, SqlValue>): unknown | null;
110
+ delete(table: string, id: number | string): boolean;
111
+ transaction(callback: (db: DB) => void): void;
112
+ exec(sql: string): void;
113
+ raw(sql: string, params?: SqlValue[]): unknown[];
114
+ rawOne(sql: string, params?: SqlValue[]): unknown | null;
115
+ private reset;
116
+ private createQueryBuilder;
117
+ private generateCreateTableSQL;
118
+ }
119
+ declare function table(name: string, columns: (ColumnDefinition | UniqueConstraint | IndexDefinition)[]): TableSchema;
120
+ declare function column(name: string, type: ColumnType): ColumnDefinition;
121
+ declare function integer(name: string): ColumnDefinition;
122
+ declare function text(name: string): ColumnDefinition;
123
+ declare function real(name: string): ColumnDefinition;
124
+ declare function blob(name: string): ColumnDefinition;
125
+ declare function numeric(name: string): ColumnDefinition;
126
+ declare function primaryKey(col: ColumnDefinition, autoIncrement?: boolean): ColumnDefinition;
127
+ declare function notNull(col: ColumnDefinition): ColumnDefinition;
128
+ declare function unique(col: ColumnDefinition): ColumnDefinition;
129
+ declare function unique(columns: string[]): UniqueConstraint;
130
+ declare function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition;
131
+ declare function references(col: ColumnDefinition, table: string, column: string, options?: ForeignKeyOptions): ColumnDefinition;
132
+ declare function index(name: string, columns: string | string[], unique?: boolean): IndexDefinition;
133
+
134
+ export { type ColumnDefinition, type ColumnType, DB, type ForeignKeyOptions, type IndexDefinition, type LastIdRow, type QueryBuilder, type QueryBuilderInternal, type SqlValue, type TableRow, type TableSchema, type UniqueConstraint, type WhereCondition, blob, column, defaultValue, index, 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 a=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);}for(let e of t.columns)if(e&&typeof e=="object"&&"_type"in e&&e._type==="index"){let s=e,n=`CREATE ${s.unique?"UNIQUE":""} INDEX IF NOT EXISTS ${s.name} ON ${t.name} (${s.columns.join(", ")})`;this.db.exec(n);}}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 o=n.value.map(()=>"?").join(", ");return n.value.forEach(l=>{r.currentParams.push(l);}),`${n.column} IN (${o})`}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),o=Object.values(this._insertData);if(n.length===0)e=`INSERT INTO ${this._from} DEFAULT VALUES`,r.currentParams=[];else {let l=n.map(()=>"?").join(", ");e=`INSERT INTO ${this._from} (${n.join(", ")}) VALUES (${l})`,r.currentParams=o;}}else if(this._isUpdate&&this._updateData){let n=Object.keys(this._updateData).map(l=>`${l} = ?`),o=Object.values(this._updateData);if(r.currentParams=[...o,...r.currentParams],e=`UPDATE ${this._from} SET ${n.join(", ")}`,this._where.length>0){let l=this.buildWhereClause();e+=` WHERE ${l}`;}}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=[],e=[];for(let u of t.columns){if(!u||typeof u!="object"||!("name"in u)){if(u&&"_type"in u&&u._type==="unique"){let l=u;e.push(`UNIQUE (${l.columns.join(", ")})`);}continue}let n=u,o=`${n.name} ${n.type}`;n.primaryKey&&(o+=" PRIMARY KEY",n.autoIncrement&&(o+=" AUTOINCREMENT")),n.notNull&&!n.primaryKey&&(o+=" NOT NULL"),n.unique&&(o+=" UNIQUE"),n.default!==void 0&&(typeof n.default=="string"?o+=` DEFAULT '${n.default}'`:n.default===null?o+=" DEFAULT NULL":o+=` DEFAULT ${n.default}`),n.references&&(o+=` REFERENCES ${n.references.table}(${n.references.column})`,n.references.options&&(n.references.options.onDelete&&(o+=` ON DELETE ${n.references.options.onDelete}`),n.references.options.onUpdate&&(o+=` ON UPDATE ${n.references.options.onUpdate}`))),r.push(o);}let s=[...r,...e];return `CREATE TABLE IF NOT EXISTS ${t.name} (${s.join(", ")})`}};function c(i,t){return {name:i,columns:t}}function f(i,t){return {name:i,type:t}}function h(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 E(i){return {name:i,type:"NUMERIC"}}function _(i,t=false){return {...i,primaryKey:true,autoIncrement:t}}function C(i){return {...i,notNull:true}}function D(i){return Array.isArray(i)?{_type:"unique",columns:i}:{...i,unique:true}}function S(i,t){return {...i,default:t}}function w(i,t,r,e){return {...i,references:{table:t,column:r,options:e}}}function b(i,t,r){return {_type:"index",name:i,columns:Array.isArray(t)?t:[t],unique:r}}export{a as DB,g as blob,f as column,S as defaultValue,b as index,h as integer,C as notNull,E as numeric,_ as primaryKey,d as real,w as references,c as table,m as text,D 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","col","indexDef","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","updateValues","whereClause","result","parts","i","results","columnDefs","uniqueConstraints","uniqueCol","columnCol","def","allDefs","name","type","integer","text","real","blob","numeric","primaryKey","autoIncrement","notNull","unique","defaultValue","references","options"],"mappings":"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","file":"main.js","sourcesContent":["// src/main.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Database } from 'bun:sqlite';\r\n import * as types from './types.d';\r\n export * from './types.d';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class DB {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private db : Database;\r\n private schemas : Map<string, types.TableSchema>;\r\n private currentQuery : string = '';\r\n private currentParams : types.SqlValue[] = [];\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── CORE ──────────────────────────────┐\r\n\r\n constructor(path: string = ':memory:') {\r\n this.schemas = new Map;\r\n this.db = new Database(path);\r\n this.db.exec('PRAGMA foreign_keys = ON');\r\n }\r\n\r\n close(): void {\r\n this.db.close();\r\n }\r\n\r\n // ════════ Schema Management ════════\r\n defineSchema(schema: types.TableSchema): void {\r\n this.schemas.set(schema.name, schema);\r\n const sql = this.generateCreateTableSQL(schema);\r\n this.db.exec(sql);\r\n\r\n // Create indexes from schema.indexes\r\n if (schema.indexes) {\r\n for (const index of schema.indexes) {\r\n const uniqueStr = index.unique ? 'UNIQUE' : '';\r\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${index.name} ON ${schema.name} (${index.columns.join(', ')})`;\r\n this.db.exec(indexSql);\r\n }\r\n }\r\n\r\n // Create indexes from columns array (from index() helper)\r\n for (const col of schema.columns) {\r\n if (col && typeof col === 'object' && '_type' in col && col._type === 'index') {\r\n const indexDef = col as types.IndexDefinition;\r\n const uniqueStr = indexDef.unique ? 'UNIQUE' : '';\r\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${indexDef.name} ON ${schema.name} (${indexDef.columns.join(', ')})`;\r\n this.db.exec(indexSql);\r\n }\r\n }\r\n }\r\n\r\n getSchema(tableName: string): types.TableSchema | undefined {\r\n return this.schemas.get(tableName);\r\n }\r\n\r\n listTables(): string[] {\r\n const result = this.db.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").all();\r\n return result.map((r: unknown) => (r as types.TableRow).name);\r\n }\r\n\r\n dropTable(tableName: string): void {\r\n this.db.exec(`DROP TABLE IF EXISTS ${tableName}`);\r\n this.schemas.delete(tableName);\r\n }\r\n\r\n // ════════ Query Builder ════════\r\n query(): types.QueryBuilder {\r\n this.reset();\r\n return this.createQueryBuilder();\r\n }\r\n\r\n // ════════ Quick Operations ════════\r\n find(table: string, conditions: Record<string, types.SqlValue>): unknown[] {\r\n const whereConditions: types.WhereCondition[] = Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n }));\r\n\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(whereConditions)\r\n .execute();\r\n }\r\n\r\n findOne(table: string, conditions: Record<string, types.SqlValue>): unknown | null {\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n })))\r\n .limit(1)\r\n .executeOne();\r\n }\r\n\r\n findById(table: string, id: number | string): unknown | null {\r\n return this.findOne(table, { id });\r\n }\r\n\r\n all(table: string): unknown[] {\r\n return this.query().select().from(table).execute();\r\n }\r\n\r\n insert(table: string, data: Record<string, types.SqlValue>): unknown {\r\n this.query().insert(table, data).execute();\r\n\r\n // Return inserted row\r\n const lastId = this.db.query('SELECT last_insert_rowid() as id').get() as types.LastIdRow;\r\n return this.findById(table, lastId.id);\r\n }\r\n\r\n update(table: string, id: number | string, data: Record<string, types.SqlValue>): unknown | null {\r\n this.query()\r\n .update(table, data)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute();\r\n\r\n return this.findById(table, id);\r\n }\r\n\r\n delete(table: string, id: number | string): boolean {\r\n this.query()\r\n .delete(table)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute();\r\n\r\n return true;\r\n }\r\n\r\n // ════════ Transactions ════════\r\n transaction(callback: (db: DB) => void): void {\r\n this.db.exec('BEGIN TRANSACTION');\r\n try {\r\n callback(this);\r\n this.db.exec('COMMIT');\r\n } catch (error) {\r\n this.db.exec('ROLLBACK');\r\n throw error;\r\n }\r\n }\r\n\r\n // ════════ Raw SQL ════════\r\n exec(sql: string): void {\r\n this.db.exec(sql);\r\n }\r\n\r\n raw(sql: string, params: types.SqlValue[] = []): unknown[] {\r\n const stmt = this.db.query(sql);\r\n return stmt.all(...params) as unknown[];\r\n }\r\n\r\n rawOne(sql: string, params: types.SqlValue[] = []): unknown | null {\r\n const stmt = this.db.query(sql);\r\n return stmt.get(...params) as unknown | null;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private reset(): void {\r\n this.currentQuery = '';\r\n this.currentParams = [];\r\n }\r\n\r\n private createQueryBuilder(): types.QueryBuilder {\r\n const builder: types.QueryBuilderInternal & Partial<types.QueryBuilder> & { buildWhereClause?: () => string } = {\r\n _select: ['*'],\r\n _from: '',\r\n _where: [],\r\n _orderBy: '',\r\n _limit: null,\r\n _offset: null,\r\n _isInsert: false,\r\n _isUpdate: false,\r\n _isDelete: false,\r\n _insertData: null,\r\n _updateData: null\r\n };\r\n\r\n // Bind methods to this DB instance\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const self = this;\r\n\r\n builder.select = function(columns?: string[]): types.QueryBuilder {\r\n this._select = columns || ['*'];\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.from = function(table: string): types.QueryBuilder {\r\n this._from = table;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.where = function(condition: types.WhereCondition | types.WhereCondition[]): types.QueryBuilder {\r\n const conditions = Array.isArray(condition) ? condition : [condition];\r\n\r\n const whereClauses = conditions.map(cond => {\r\n if (cond.operator === 'IS NULL' || cond.operator === 'IS NOT NULL') {\r\n return `${cond.column} ${cond.operator}`;\r\n } else if (cond.operator === 'IN' && Array.isArray(cond.value)) {\r\n const placeholders = cond.value.map(() => '?').join(', ');\r\n // Spread array values into params\r\n cond.value.forEach(val => {\r\n self.currentParams.push(val as types.SqlValue);\r\n });\r\n return `${cond.column} IN (${placeholders})`;\r\n } else {\r\n self.currentParams.push(cond.value as types.SqlValue);\r\n return `${cond.column} ${cond.operator} ?`;\r\n }\r\n });\r\n\r\n this._where.push(...whereClauses);\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.and = function(condition: types.WhereCondition): types.QueryBuilder {\r\n return this.where!(condition);\r\n };\r\n\r\n builder.or = function(condition: types.WhereCondition): types.QueryBuilder {\r\n let clause = '';\r\n if (condition.operator === 'IS NULL' || condition.operator === 'IS NOT NULL') {\r\n clause = `${condition.column} ${condition.operator}`;\r\n } else if (condition.operator === 'IN' && Array.isArray(condition.value)) {\r\n const placeholders = condition.value.map(() => '?').join(', ');\r\n // Spread array values into params\r\n condition.value.forEach(val => {\r\n self.currentParams.push(val as types.SqlValue);\r\n });\r\n clause = `${condition.column} IN (${placeholders})`;\r\n } else {\r\n self.currentParams.push(condition.value as types.SqlValue);\r\n clause = `${condition.column} ${condition.operator} ?`;\r\n }\r\n\r\n // Add OR prefix to the clause itself\r\n this._where.push(`OR ${clause}`);\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.orderBy = function(column: string, direction: 'ASC' | 'DESC' = 'ASC'): types.QueryBuilder {\r\n this._orderBy = `ORDER BY ${column} ${direction}`;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.limit = function(count: number): types.QueryBuilder {\r\n this._limit = count;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.offset = function(count: number): types.QueryBuilder {\r\n this._offset = count;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.insert = function(table: string, data: Record<string, types.SqlValue>): types.QueryBuilder {\r\n this._isInsert = true;\r\n this._from = table;\r\n this._insertData = data;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.update = function(table: string, data: Record<string, types.SqlValue>): types.QueryBuilder {\r\n this._isUpdate = true;\r\n this._from = table;\r\n this._updateData = data;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.delete = function(table: string): types.QueryBuilder {\r\n this._isDelete = true;\r\n this._from = table;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.raw = function(sql: string, params: types.SqlValue[] = []): types.QueryBuilder {\r\n self.currentQuery = sql;\r\n self.currentParams = params;\r\n return this as unknown as types.QueryBuilder;\r\n };\r\n\r\n builder.execute = function(): unknown[] {\r\n let sql = '';\r\n\r\n if (this._isInsert && this._insertData) {\r\n const columns = Object.keys(this._insertData);\r\n const values = Object.values(this._insertData);\r\n\r\n // Handle empty insert (all defaults)\r\n if (columns.length === 0) {\r\n sql = `INSERT INTO ${this._from} DEFAULT VALUES`;\r\n self.currentParams = [];\r\n } else {\r\n const placeholders = columns.map(() => '?').join(', ');\r\n sql = `INSERT INTO ${this._from} (${columns.join(', ')}) VALUES (${placeholders})`;\r\n self.currentParams = values;\r\n }\r\n } else if (this._isUpdate && this._updateData) {\r\n const setClauses = Object.keys(this._updateData).map(col => `${col} = ?`);\r\n const updateValues = Object.values(this._updateData);\r\n self.currentParams = [...updateValues, ...self.currentParams] as types.SqlValue[];\r\n sql = `UPDATE ${this._from} SET ${setClauses.join(', ')}`;\r\n\r\n if (this._where.length > 0) {\r\n // Build WHERE clause properly handling OR conditions\r\n const whereClause = this.buildWhereClause!();\r\n sql += ` WHERE ${whereClause}`;\r\n }\r\n } else if (this._isDelete) {\r\n sql = `DELETE FROM ${this._from}`;\r\n\r\n if (this._where.length > 0) {\r\n // Build WHERE clause properly handling OR conditions\r\n const whereClause = this.buildWhereClause!();\r\n sql += ` WHERE ${whereClause}`;\r\n }\r\n } else {\r\n // SELECT query or raw query\r\n if (self.currentQuery) {\r\n sql = self.currentQuery;\r\n } else {\r\n sql = `SELECT ${this._select.join(', ')} FROM ${this._from}`;\r\n\r\n if (this._where.length > 0) {\r\n // Build WHERE clause properly handling OR conditions\r\n const whereClause = this.buildWhereClause!();\r\n sql += ` WHERE ${whereClause}`;\r\n }\r\n\r\n if (this._orderBy) {\r\n sql += ` ${this._orderBy}`;\r\n }\r\n\r\n if (this._limit !== null) {\r\n sql += ` LIMIT ${this._limit}`;\r\n }\r\n\r\n // OFFSET requires LIMIT in SQLite\r\n if (this._offset !== null) {\r\n if (this._limit === null) {\r\n // Add a very large limit if offset is used without limit\r\n sql += ` LIMIT -1`;\r\n }\r\n sql += ` OFFSET ${this._offset}`;\r\n }\r\n }\r\n }\r\n\r\n const stmt = self.db.query(sql);\r\n const result = stmt.all(...self.currentParams) as unknown[];\r\n self.reset();\r\n return result;\r\n };\r\n\r\n builder.buildWhereClause = function(): string {\r\n const parts: string[] = [];\r\n for (let i = 0; i < this._where.length; i++) {\r\n const clause = this._where[i];\r\n if (clause.startsWith('OR ')) {\r\n parts.push('OR');\r\n parts.push(clause.substring(3)); // Remove 'OR ' prefix\r\n } else {\r\n if (i > 0 && !this._where[i - 1].startsWith('OR ')) {\r\n parts.push('AND');\r\n }\r\n parts.push(clause);\r\n }\r\n }\r\n return parts.join(' ');\r\n };\r\n\r\n builder.executeOne = function(): unknown | null {\r\n const results = this.execute!();\r\n return results.length > 0 ? results[0] : null;\r\n };\r\n\r\n builder.executeRaw = function(sql: string, params: types.SqlValue[] = []): unknown[] {\r\n const stmt = self.db.query(sql);\r\n const result = stmt.all(...params) as unknown[];\r\n return result;\r\n };\r\n\r\n return builder as types.QueryBuilder;\r\n }\r\n\r\n private generateCreateTableSQL(schema: types.TableSchema): string {\r\n const columnDefs: string[] = [];\r\n const uniqueConstraints: string[] = [];\r\n\r\n for (const col of schema.columns) {\r\n // Skip constraint definitions, they're handled separately\r\n if (!col || typeof col !== 'object' || !('name' in col)) {\r\n if (col && '_type' in col && col._type === 'unique') {\r\n const uniqueCol = col as types.UniqueConstraint;\r\n uniqueConstraints.push(`UNIQUE (${uniqueCol.columns.join(', ')})`);\r\n }\r\n continue;\r\n }\r\n\r\n const columnCol = col as types.ColumnDefinition;\r\n let def = `${columnCol.name} ${columnCol.type}`;\r\n\r\n if (columnCol.primaryKey) {\r\n def += ' PRIMARY KEY';\r\n if (columnCol.autoIncrement) {\r\n def += ' AUTOINCREMENT';\r\n }\r\n }\r\n\r\n if (columnCol.notNull && !columnCol.primaryKey) {\r\n def += ' NOT NULL';\r\n }\r\n\r\n if (columnCol.unique) {\r\n def += ' UNIQUE';\r\n }\r\n\r\n if (columnCol.default !== undefined) {\r\n if (typeof columnCol.default === 'string') {\r\n def += ` DEFAULT '${columnCol.default}'`;\r\n } else if (columnCol.default === null) {\r\n def += ' DEFAULT NULL';\r\n } else {\r\n def += ` DEFAULT ${columnCol.default}`;\r\n }\r\n }\r\n\r\n if (columnCol.references) {\r\n def += ` REFERENCES ${columnCol.references.table}(${columnCol.references.column})`;\r\n if (columnCol.references.options) {\r\n if (columnCol.references.options.onDelete) {\r\n def += ` ON DELETE ${columnCol.references.options.onDelete}`;\r\n }\r\n if (columnCol.references.options.onUpdate) {\r\n def += ` ON UPDATE ${columnCol.references.options.onUpdate}`;\r\n }\r\n }\r\n }\r\n\r\n columnDefs.push(def);\r\n }\r\n\r\n // Add unique constraints\r\n const allDefs = [...columnDefs, ...uniqueConstraints];\r\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${allDefs.join(', ')})`;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n // ════════ Schema Builder Helpers ════════\r\n export function table(name: string, columns: (types.ColumnDefinition | types.UniqueConstraint | types.IndexDefinition)[]): types.TableSchema {\r\n return { name, columns };\r\n }\r\n\r\n export function column(name: string, type: types.ColumnType): types.ColumnDefinition {\r\n return { name, type };\r\n }\r\n\r\n export function integer(name: string): types.ColumnDefinition {\r\n return { name, type: 'INTEGER' };\r\n }\r\n\r\n export function text(name: string): types.ColumnDefinition {\r\n return { name, type: 'TEXT' };\r\n }\r\n\r\n export function real(name: string): types.ColumnDefinition {\r\n return { name, type: 'REAL' };\r\n }\r\n\r\n export function blob(name: string): types.ColumnDefinition {\r\n return { name, type: 'BLOB' };\r\n }\r\n\r\n export function numeric(name: string): types.ColumnDefinition {\r\n return { name, type: 'NUMERIC' };\r\n }\r\n\r\n // ════════ Column Modifiers ════════\r\n export function primaryKey(col: types.ColumnDefinition, autoIncrement = false): types.ColumnDefinition {\r\n return { ...col, primaryKey: true, autoIncrement };\r\n }\r\n\r\n export function notNull(col: types.ColumnDefinition): types.ColumnDefinition {\r\n return { ...col, notNull: true };\r\n }\r\n\r\n export function unique(col: types.ColumnDefinition): types.ColumnDefinition;\r\n export function unique(columns: string[]): types.UniqueConstraint;\r\n export function unique(col: types.ColumnDefinition | string[]): types.ColumnDefinition | types.UniqueConstraint {\r\n // If it's an array, treat it as composite unique constraint\r\n if (Array.isArray(col)) {\r\n return { _type: 'unique', columns: col };\r\n }\r\n // Otherwise, it's a single column unique constraint\r\n return { ...col, unique: true };\r\n }\r\n\r\n export function defaultValue(col: types.ColumnDefinition, value: types.SqlValue): types.ColumnDefinition {\r\n return { ...col, default: value };\r\n }\r\n\r\n export function references(col: types.ColumnDefinition, table: string, column: string, options?: types.ForeignKeyOptions): types.ColumnDefinition {\r\n return { ...col, references: { table, column, options } };\r\n }\r\n\r\n export function index(name: string, columns: string | string[], unique?: boolean): types.IndexDefinition {\r\n return { _type: 'index', name, columns: Array.isArray(columns) ? columns : [columns], unique };\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@minejs/db",
3
+ "version": "0.0.1",
4
+ "description": "Lightweight SQLite database wrapper with fluent query builder and schema management.",
5
+ "keywords": ["minejs", "database"],
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/minejs-org/db#readme",
8
+ "bugs": {
9
+ "url": "https://github.com/minejs-org/db/issues"
10
+ },
11
+ "author": {
12
+ "name": "Maysara",
13
+ "email": "maysara.elshewehy@gmail.com",
14
+ "url": "https://github.com/maysara-elshewehy"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/minejs-org/db.git"
19
+ },
20
+ "type": "module",
21
+ "main": "./dist/main.js",
22
+ "types": "./dist/main.d.ts",
23
+ "files": ["dist"],
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/main.d.ts",
27
+ "import": "./dist/main.js",
28
+ "require": "./dist/main.js"
29
+ }
30
+ },
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "lint": "eslint src --ext .ts",
34
+ "test": "bun test"
35
+ },
36
+ "engines": {
37
+ "bun": ">=1.3.3"
38
+ },
39
+ "peerDependencies": {
40
+ "bun": "^1.3.3"
41
+ },
42
+ "devDependencies": {
43
+ "@eslint/js": "^9.39.2",
44
+ "@stylistic/eslint-plugin": "^5.6.1",
45
+ "@types/bun": "^1.3.5",
46
+ "@types/node": "^20.19.27",
47
+ "bun-plugin-dts": "^0.3.0",
48
+ "bun-types": "^1.3.5",
49
+ "ts-node": "^10.9.2",
50
+ "tsup": "^8.5.1",
51
+ "typescript": "^5.9.3",
52
+ "typescript-eslint": "^8.51.0"
53
+ }
54
+ }