@je-es/sdb 0.0.2 → 0.0.3

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/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  </div>
9
9
 
10
10
  <div align="center">
11
- <img src="https://img.shields.io/badge/v-0.0.2-black"/>
11
+ <img src="https://img.shields.io/badge/v-0.0.3-black"/>
12
12
  <img src="https://img.shields.io/badge/🔥-@je--es-black"/>
13
13
  <br>
14
14
  <img src="https://github.com/je-es/sdb/actions/workflows/ci.yml/badge.svg" alt="CI" />
@@ -201,7 +201,7 @@
201
201
 
202
202
  - ##### Foreign Keys & Indexes
203
203
  ```ts
204
- import { references } from '@je-es/sdb';
204
+ import { references, index } from '@je-es/sdb';
205
205
 
206
206
  // Table with foreign key
207
207
  const postsSchema = table('posts', [
@@ -225,23 +225,31 @@
225
225
  references(integer('org_id'), 'organizations', 'id', { onDelete: 'SET NULL' })
226
226
  ]);
227
227
 
228
+ // Table with composite unique constraints
229
+ const providersSchema = table('oauth_providers', [
230
+ primaryKey(integer('id'), true),
231
+ notNull(integer('user_id')),
232
+ notNull(text('provider')),
233
+ text('provider_id'),
234
+ unique(['user_id', 'provider']), // One provider per account
235
+ unique(['provider', 'provider_id']), // Provider ID must be globally unique
236
+ index('idx_user_id', 'user_id'),
237
+ index('idx_provider', 'provider')
238
+ ]);
239
+
228
240
  // Table with indexes
229
- const productsSchema = {
230
- name: 'products',
231
- columns: [
232
- { ...primaryKey(integer('id'), true) },
233
- { ...text('name') },
234
- { ...real('price') }
235
- ],
236
- indexes: [
237
- { name: 'idx_name', columns: ['name'] },
238
- { name: 'idx_price', columns: ['price'], unique: true }
239
- ]
240
- };
241
+ const productsSchema = table('products', [
242
+ primaryKey(integer('id'), true),
243
+ text('name'),
244
+ defaultValue(real('discount_percent'), 0),
245
+ index('idx_name', 'name'),
246
+ index('idx_discount', 'discount_percent', true) // unique index
247
+ ]);
241
248
 
242
249
  db.defineSchema(postsSchema);
243
250
  db.defineSchema(ordersSchema);
244
251
  db.defineSchema(projectsSchema);
252
+ db.defineSchema(providersSchema);
245
253
  db.defineSchema(productsSchema);
246
254
  ```
247
255
 
@@ -278,9 +286,11 @@
278
286
 
279
287
  - `primaryKey(col, autoIncrement?)` - Mark as primary key
280
288
  - `notNull(col)` - Add NOT NULL constraint
281
- - `unique(col)` - Add UNIQUE constraint
289
+ - `unique(col)` - Add UNIQUE constraint on single column
290
+ - `unique(columns[])` - Add UNIQUE constraint on multiple columns (composite)
282
291
  - `defaultValue(col, value)` - Set default value
283
- - `references(col, table, column, options?)` - Add foreign key constraint with optional `onDelete` (`CASCADE` | `SET NULL` | `RESTRICT` | `NO ACTION` | `SET DEFAULT`) and `onUpdate` behavior
292
+ - `references(col, table, column, options?)` - Add foreign key constraint with optional `onDelete` and `onUpdate` behavior
293
+ - `index(name, columns, unique?)` - Create index on one or more columns
284
294
 
285
295
  <!-- ╚═════════════════════════════════════════════════════════════════╝ -->
286
296
 
package/dist/main.cjs CHANGED
@@ -1,2 +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})`,e.references.options&&(e.references.options.onDelete&&(s+=` ON DELETE ${e.references.options.onDelete}`),e.references.options.onUpdate&&(s+=` ON UPDATE ${e.references.options.onUpdate}`))),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 E(i){return {name:i,type:"NUMERIC"}}function _(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 T(i,t,r,e){return {...i,references:{table:t,column:r,options:e}}}exports.DB=o;exports.blob=g;exports.column=f;exports.defaultValue=b;exports.integer=c;exports.notNull=w;exports.numeric=E;exports.primaryKey=_;exports.real=d;exports.references=T;exports.table=h;exports.text=m;exports.unique=S;//# sourceMappingURL=main.cjs.map
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
2
  //# sourceMappingURL=main.cjs.map
package/dist/main.cjs.map CHANGED
@@ -1 +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","options"],"mappings":"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","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 if (col.references.options) {\n if (col.references.options.onDelete) {\n def += ` ON DELETE ${col.references.options.onDelete}`;\n }\n if (col.references.options.onUpdate) {\n def += ` ON UPDATE ${col.references.options.onUpdate}`;\n }\n }\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, options?: types.ForeignKeyOptions): types.ColumnDefinition {\n return { ...col, references: { table, column, options } };\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
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\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 from schema.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 // Create indexes from columns array (from index() helper)\n for (const col of schema.columns) {\n if (col && typeof col === 'object' && '_type' in col && col._type === 'index') {\n const indexDef = col as types.IndexDefinition;\n const uniqueStr = indexDef.unique ? 'UNIQUE' : '';\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${indexDef.name} ON ${schema.name} (${indexDef.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: string[] = [];\n const uniqueConstraints: string[] = [];\n\n for (const col of schema.columns) {\n // Skip constraint definitions, they're handled separately\n if (!col || typeof col !== 'object' || !('name' in col)) {\n if (col && '_type' in col && col._type === 'unique') {\n const uniqueCol = col as types.UniqueConstraint;\n uniqueConstraints.push(`UNIQUE (${uniqueCol.columns.join(', ')})`);\n }\n continue;\n }\n\n const columnCol = col as types.ColumnDefinition;\n let def = `${columnCol.name} ${columnCol.type}`;\n\n if (columnCol.primaryKey) {\n def += ' PRIMARY KEY';\n if (columnCol.autoIncrement) {\n def += ' AUTOINCREMENT';\n }\n }\n\n if (columnCol.notNull && !columnCol.primaryKey) {\n def += ' NOT NULL';\n }\n\n if (columnCol.unique) {\n def += ' UNIQUE';\n }\n\n if (columnCol.default !== undefined) {\n if (typeof columnCol.default === 'string') {\n def += ` DEFAULT '${columnCol.default}'`;\n } else if (columnCol.default === null) {\n def += ' DEFAULT NULL';\n } else {\n def += ` DEFAULT ${columnCol.default}`;\n }\n }\n\n if (columnCol.references) {\n def += ` REFERENCES ${columnCol.references.table}(${columnCol.references.column})`;\n if (columnCol.references.options) {\n if (columnCol.references.options.onDelete) {\n def += ` ON DELETE ${columnCol.references.options.onDelete}`;\n }\n if (columnCol.references.options.onUpdate) {\n def += ` ON UPDATE ${columnCol.references.options.onUpdate}`;\n }\n }\n }\n\n columnDefs.push(def);\n }\n\n // Add unique constraints\n const allDefs = [...columnDefs, ...uniqueConstraints];\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${allDefs.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.UniqueConstraint | types.IndexDefinition)[]): 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 export function unique(columns: string[]): types.UniqueConstraint;\n export function unique(col: types.ColumnDefinition | string[]): types.ColumnDefinition | types.UniqueConstraint {\n // If it's an array, treat it as composite unique constraint\n if (Array.isArray(col)) {\n return { _type: 'unique', columns: col };\n }\n // Otherwise, it's a single column unique constraint\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, options?: types.ForeignKeyOptions): types.ColumnDefinition {\n return { ...col, references: { table, column, options } };\n }\n\n export function index(name: string, columns: string | string[], unique?: boolean): types.IndexDefinition {\n return { _type: 'index', name, columns: Array.isArray(columns) ? columns : [columns], unique };\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
package/dist/main.d.cts CHANGED
@@ -25,9 +25,21 @@
25
25
  references? : { table: string; column: string; options?: ForeignKeyOptions };
26
26
  }
27
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
+
28
40
  interface TableSchema {
29
41
  name : string;
30
- columns : ColumnDefinition[];
42
+ columns : (ColumnDefinition | UniqueConstraint | IndexDefinition)[];
31
43
  indexes? : { name: string; columns: string[]; unique?: boolean }[];
32
44
  }
33
45
 
@@ -104,7 +116,7 @@ declare class DB {
104
116
  private createQueryBuilder;
105
117
  private generateCreateTableSQL;
106
118
  }
107
- declare function table(name: string, columns: ColumnDefinition[]): TableSchema;
119
+ declare function table(name: string, columns: (ColumnDefinition | UniqueConstraint | IndexDefinition)[]): TableSchema;
108
120
  declare function column(name: string, type: ColumnType): ColumnDefinition;
109
121
  declare function integer(name: string): ColumnDefinition;
110
122
  declare function text(name: string): ColumnDefinition;
@@ -114,7 +126,9 @@ declare function numeric(name: string): ColumnDefinition;
114
126
  declare function primaryKey(col: ColumnDefinition, autoIncrement?: boolean): ColumnDefinition;
115
127
  declare function notNull(col: ColumnDefinition): ColumnDefinition;
116
128
  declare function unique(col: ColumnDefinition): ColumnDefinition;
129
+ declare function unique(columns: string[]): UniqueConstraint;
117
130
  declare function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition;
118
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;
119
133
 
120
- export { type ColumnDefinition, type ColumnType, DB, type ForeignKeyOptions, 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 };
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 CHANGED
@@ -25,9 +25,21 @@
25
25
  references? : { table: string; column: string; options?: ForeignKeyOptions };
26
26
  }
27
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
+
28
40
  interface TableSchema {
29
41
  name : string;
30
- columns : ColumnDefinition[];
42
+ columns : (ColumnDefinition | UniqueConstraint | IndexDefinition)[];
31
43
  indexes? : { name: string; columns: string[]; unique?: boolean }[];
32
44
  }
33
45
 
@@ -104,7 +116,7 @@ declare class DB {
104
116
  private createQueryBuilder;
105
117
  private generateCreateTableSQL;
106
118
  }
107
- declare function table(name: string, columns: ColumnDefinition[]): TableSchema;
119
+ declare function table(name: string, columns: (ColumnDefinition | UniqueConstraint | IndexDefinition)[]): TableSchema;
108
120
  declare function column(name: string, type: ColumnType): ColumnDefinition;
109
121
  declare function integer(name: string): ColumnDefinition;
110
122
  declare function text(name: string): ColumnDefinition;
@@ -114,7 +126,9 @@ declare function numeric(name: string): ColumnDefinition;
114
126
  declare function primaryKey(col: ColumnDefinition, autoIncrement?: boolean): ColumnDefinition;
115
127
  declare function notNull(col: ColumnDefinition): ColumnDefinition;
116
128
  declare function unique(col: ColumnDefinition): ColumnDefinition;
129
+ declare function unique(columns: string[]): UniqueConstraint;
117
130
  declare function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition;
118
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;
119
133
 
120
- export { type ColumnDefinition, type ColumnType, DB, type ForeignKeyOptions, 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 };
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 CHANGED
@@ -1,2 +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})`,e.references.options&&(e.references.options.onDelete&&(s+=` ON DELETE ${e.references.options.onDelete}`),e.references.options.onUpdate&&(s+=` ON UPDATE ${e.references.options.onUpdate}`))),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 E(i){return {name:i,type:"NUMERIC"}}function _(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 T(i,t,r,e){return {...i,references:{table:t,column:r,options:e}}}export{o as DB,g as blob,f as column,b as defaultValue,c as integer,w as notNull,E as numeric,_ as primaryKey,d as real,T as references,h as table,m as text,S as unique};//# sourceMappingURL=main.js.map
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
2
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +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","options"],"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 if (col.references.options) {\n if (col.references.options.onDelete) {\n def += ` ON DELETE ${col.references.options.onDelete}`;\n }\n if (col.references.options.onUpdate) {\n def += ` ON UPDATE ${col.references.options.onUpdate}`;\n }\n }\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, options?: types.ForeignKeyOptions): types.ColumnDefinition {\n return { ...col, references: { table, column, options } };\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
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\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 from schema.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 // Create indexes from columns array (from index() helper)\n for (const col of schema.columns) {\n if (col && typeof col === 'object' && '_type' in col && col._type === 'index') {\n const indexDef = col as types.IndexDefinition;\n const uniqueStr = indexDef.unique ? 'UNIQUE' : '';\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${indexDef.name} ON ${schema.name} (${indexDef.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: string[] = [];\n const uniqueConstraints: string[] = [];\n\n for (const col of schema.columns) {\n // Skip constraint definitions, they're handled separately\n if (!col || typeof col !== 'object' || !('name' in col)) {\n if (col && '_type' in col && col._type === 'unique') {\n const uniqueCol = col as types.UniqueConstraint;\n uniqueConstraints.push(`UNIQUE (${uniqueCol.columns.join(', ')})`);\n }\n continue;\n }\n\n const columnCol = col as types.ColumnDefinition;\n let def = `${columnCol.name} ${columnCol.type}`;\n\n if (columnCol.primaryKey) {\n def += ' PRIMARY KEY';\n if (columnCol.autoIncrement) {\n def += ' AUTOINCREMENT';\n }\n }\n\n if (columnCol.notNull && !columnCol.primaryKey) {\n def += ' NOT NULL';\n }\n\n if (columnCol.unique) {\n def += ' UNIQUE';\n }\n\n if (columnCol.default !== undefined) {\n if (typeof columnCol.default === 'string') {\n def += ` DEFAULT '${columnCol.default}'`;\n } else if (columnCol.default === null) {\n def += ' DEFAULT NULL';\n } else {\n def += ` DEFAULT ${columnCol.default}`;\n }\n }\n\n if (columnCol.references) {\n def += ` REFERENCES ${columnCol.references.table}(${columnCol.references.column})`;\n if (columnCol.references.options) {\n if (columnCol.references.options.onDelete) {\n def += ` ON DELETE ${columnCol.references.options.onDelete}`;\n }\n if (columnCol.references.options.onUpdate) {\n def += ` ON UPDATE ${columnCol.references.options.onUpdate}`;\n }\n }\n }\n\n columnDefs.push(def);\n }\n\n // Add unique constraints\n const allDefs = [...columnDefs, ...uniqueConstraints];\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${allDefs.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.UniqueConstraint | types.IndexDefinition)[]): 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 export function unique(columns: string[]): types.UniqueConstraint;\n export function unique(col: types.ColumnDefinition | string[]): types.ColumnDefinition | types.UniqueConstraint {\n // If it's an array, treat it as composite unique constraint\n if (Array.isArray(col)) {\n return { _type: 'unique', columns: col };\n }\n // Otherwise, it's a single column unique constraint\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, options?: types.ForeignKeyOptions): types.ColumnDefinition {\n return { ...col, references: { table, column, options } };\n }\n\n export function index(name: string, columns: string | string[], unique?: boolean): types.IndexDefinition {\n return { _type: 'index', name, columns: Array.isArray(columns) ? columns : [columns], unique };\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@je-es/sdb",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "A lightweight, type-safe SQLite database wrapper for Bun with an elegant API and zero dependencies.",
5
5
  "keywords": ["je-es", "server", "database"],
6
6
  "license": "MIT",