@je-es/server 0.0.6 → 0.0.8

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/dist/main.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mod/db.ts","../src/mod/router.ts","../src/mod/security.ts","../src/mod/logger.ts","../src/types.d.ts","../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","direction","count","setClauses","col","updateValues","result","results","columnDefs","def","name","type","integer","text","real","blob","numeric","primaryKey","autoIncrement","notNull","unique","defaultValue","references","Router","method","key","route","match","staticRoutes","handler","colonIndex","dynamicRoutes","r","config","pattern","existingIndex","SecurityManager","max","windowMs","now","record","sessionId","ttl","token","crypto","stored","html","input","ip","status","duration","first","Logger","level","pretty","msg","levelNum","ts","safeData","output","str","AppError","message","statusCode","code","ValidationError","issues","DatabaseError","TimeoutError","RateLimitError","security","router","server","port","hostname","maxReqSize","requestTimeout","gracefulShutdownTimeout","logCfg","logger","dbs","routes","activeRequests","cleanupInterval","handleRequest","request","startTime","requestId","getClientIp","contentLength","corsHeaders","handleCors","rateLimitCfg","rateLimitKey","body","parseBody","defaultDb","routeMatch","ctx","createAppContext","controller","timeoutPromise","_","reject","response","resHeaders","errorMessage","healthRoute","c","readinessRoute","dbConnected","ready","m","bunServer","instance","dbConfigs","dbCfg","dbName","db","tableSchema","url","deadline","resolve","e","maxSize","contentType","parseCookies","cookieHeader","cookies","pairs","pair","valueParts","query","headers","cookieStore","parsedCookies","file","options","cookie","h","forwarded","realIp","corsConfig","origin","methods","allowedHeaders","main_default"],"mappings":"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","file":"main.cjs","sourcesContent":["// src/mod/db.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Database } from 'bun:sqlite'\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type ColumnType = 'INTEGER' | 'TEXT' | 'REAL' | 'BLOB' | 'NUMERIC'\r\n export type SqlValue = string | number | boolean | null | Uint8Array\r\n\r\n export interface ColumnDefinition {\r\n name : string\r\n type : ColumnType\r\n primaryKey? : boolean\r\n autoIncrement? : boolean\r\n notNull? : boolean\r\n unique? : boolean\r\n default? : SqlValue\r\n references? : { table: string; column: string }\r\n }\r\n\r\n export interface TableSchema {\r\n name : string\r\n columns : ColumnDefinition[]\r\n indexes? : { name: string; columns: string[]; unique?: boolean }[]\r\n }\r\n\r\n export interface WhereCondition {\r\n column : string\r\n operator : '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'IN' | 'IS NULL' | 'IS NOT NULL'\r\n value? : SqlValue | SqlValue[]\r\n }\r\n\r\n export interface QueryBuilder {\r\n select : (columns?: string[]) => QueryBuilder\r\n from : (table: string) => QueryBuilder\r\n where : (condition: WhereCondition | WhereCondition[]) => QueryBuilder\r\n and : (condition: WhereCondition) => QueryBuilder\r\n or : (condition: WhereCondition) => QueryBuilder\r\n orderBy : (column: string, direction?: 'ASC' | 'DESC') => QueryBuilder\r\n limit : (count: number) => QueryBuilder\r\n offset : (count: number) => QueryBuilder\r\n insert : (table: string, data: Record<string, SqlValue>) => QueryBuilder\r\n update : (table: string, data: Record<string, SqlValue>) => QueryBuilder\r\n delete : (table: string) => QueryBuilder\r\n execute : () => any[]\r\n executeOne : () => any | null\r\n executeRaw : (sql: string, params?: SqlValue[]) => any[]\r\n raw : (sql: string, params?: SqlValue[]) => QueryBuilder\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class DB {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private db : Database\r\n private schemas : Map<string, TableSchema> = new Map()\r\n private currentQuery : string = ''\r\n private currentParams : SqlValue[] = []\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── CORE ──────────────────────────────┐\r\n\r\n constructor(path: string = ':memory:') {\r\n this.db = new Database(path)\r\n this.db.exec('PRAGMA foreign_keys = ON')\r\n }\r\n\r\n close() {\r\n this.db.close()\r\n }\r\n\r\n // ════════ Schema Management ════════\r\n defineSchema(schema: TableSchema): void {\r\n this.schemas.set(schema.name, schema)\r\n const sql = this.generateCreateTableSQL(schema)\r\n this.db.exec(sql)\r\n\r\n // Create indexes\r\n if (schema.indexes) {\r\n for (const index of schema.indexes) {\r\n const uniqueStr = index.unique ? 'UNIQUE' : ''\r\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${index.name} ON ${schema.name} (${index.columns.join(', ')})`\r\n this.db.exec(indexSql)\r\n }\r\n }\r\n }\r\n\r\n getSchema(tableName: string): TableSchema | undefined {\r\n return this.schemas.get(tableName)\r\n }\r\n\r\n listTables(): string[] {\r\n const result = this.db.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").all()\r\n return result.map((r: any) => r.name)\r\n }\r\n\r\n dropTable(tableName: string): void {\r\n this.db.exec(`DROP TABLE IF EXISTS ${tableName}`)\r\n this.schemas.delete(tableName)\r\n }\r\n\r\n // ════════ Query Builder ════════\r\n query(): QueryBuilder {\r\n this.reset()\r\n return this.createQueryBuilder()\r\n }\r\n\r\n // ════════ Quick Operations ════════\r\n find(table: string, conditions: Record<string, SqlValue>): any[] {\r\n const whereConditions: WhereCondition[] = Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n }))\r\n\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(whereConditions)\r\n .execute()\r\n }\r\n\r\n findOne(table: string, conditions: Record<string, SqlValue>): any | null {\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n })))\r\n .limit(1)\r\n .executeOne()\r\n }\r\n\r\n findById(table: string, id: number | string): any | null {\r\n return this.findOne(table, { id })\r\n }\r\n\r\n all(table: string): any[] {\r\n return this.query().select().from(table).execute()\r\n }\r\n\r\n insert(table: string, data: Record<string, SqlValue>): any {\r\n this.query().insert(table, data).execute()\r\n\r\n // Return inserted row\r\n const lastId = this.db.query('SELECT last_insert_rowid() as id').get() as any\r\n return this.findById(table, lastId.id)\r\n }\r\n\r\n update(table: string, id: number | string, data: Record<string, SqlValue>): any | null {\r\n this.query()\r\n .update(table, data)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute()\r\n\r\n return this.findById(table, id)\r\n }\r\n\r\n delete(table: string, id: number | string): boolean {\r\n const result = this.query()\r\n .delete(table)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute()\r\n\r\n return true\r\n }\r\n\r\n // ════════ Transactions ════════\r\n transaction(callback: (db: DB) => void): void {\r\n this.db.exec('BEGIN TRANSACTION')\r\n try {\r\n callback(this)\r\n this.db.exec('COMMIT')\r\n } catch (error) {\r\n this.db.exec('ROLLBACK')\r\n throw error\r\n }\r\n }\r\n\r\n // ════════ Raw SQL ════════\r\n exec(sql: string): void {\r\n this.db.exec(sql)\r\n }\r\n\r\n raw(sql: string, params: SqlValue[] = []): any[] {\r\n const stmt = this.db.query(sql)\r\n return stmt.all(...params) as any[]\r\n }\r\n\r\n rawOne(sql: string, params: SqlValue[] = []): any | null {\r\n const stmt = this.db.query(sql)\r\n return stmt.get(...params) as any | null\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private reset(): void {\r\n this.currentQuery = ''\r\n this.currentParams = []\r\n }\r\n\r\n private createQueryBuilder(): QueryBuilder {\r\n const builder: any = {\r\n _select: ['*'],\r\n _from: '',\r\n _where: [] as string[],\r\n _orderBy: '',\r\n _limit: null as number | null,\r\n _offset: null as number | null,\r\n _isInsert: false,\r\n _isUpdate: false,\r\n _isDelete: false,\r\n _insertData: null as Record<string, SqlValue> | null,\r\n _updateData: null as Record<string, SqlValue> | null\r\n }\r\n\r\n const self = this\r\n\r\n builder.select = function(columns?: string[]) {\r\n this._select = columns || ['*']\r\n return this\r\n }\r\n\r\n builder.from = function(table: string) {\r\n this._from = table\r\n return this\r\n }\r\n\r\n builder.where = function(condition: WhereCondition | WhereCondition[]) {\r\n const conditions = Array.isArray(condition) ? condition : [condition]\r\n\r\n const whereClauses = conditions.map(cond => {\r\n if (cond.operator === 'IS NULL' || cond.operator === 'IS NOT NULL') {\r\n return `${cond.column} ${cond.operator}`\r\n } else if (cond.operator === 'IN' && Array.isArray(cond.value)) {\r\n const placeholders = cond.value.map(() => '?').join(', ')\r\n // Spread array values into params\r\n cond.value.forEach(val => {\r\n self.currentParams.push(val as SqlValue)\r\n })\r\n return `${cond.column} IN (${placeholders})`\r\n } else {\r\n self.currentParams.push(cond.value as SqlValue)\r\n return `${cond.column} ${cond.operator} ?`\r\n }\r\n })\r\n\r\n this._where.push(...whereClauses)\r\n return this\r\n }\r\n\r\n builder.and = function(condition: WhereCondition) {\r\n return this.where(condition)\r\n }\r\n\r\n builder.or = function(condition: WhereCondition) {\r\n if (condition.operator === 'IS NULL' || condition.operator === 'IS NOT NULL') {\r\n this._where.push(`OR ${condition.column} ${condition.operator}`)\r\n } else if (condition.operator === 'IN' && Array.isArray(condition.value)) {\r\n const placeholders = condition.value.map(() => '?').join(', ')\r\n // Spread array values into params\r\n condition.value.forEach(val => {\r\n self.currentParams.push(val as SqlValue)\r\n })\r\n this._where.push(`OR ${condition.column} IN (${placeholders})`)\r\n } else {\r\n self.currentParams.push(condition.value as SqlValue)\r\n this._where.push(`OR ${condition.column} ${condition.operator} ?`)\r\n }\r\n return this\r\n }\r\n\r\n builder.orderBy = function(column: string, direction: 'ASC' | 'DESC' = 'ASC') {\r\n this._orderBy = `ORDER BY ${column} ${direction}`\r\n return this\r\n }\r\n\r\n builder.limit = function(count: number) {\r\n this._limit = count\r\n return this\r\n }\r\n\r\n builder.offset = function(count: number) {\r\n this._offset = count\r\n return this\r\n }\r\n\r\n builder.insert = function(table: string, data: Record<string, SqlValue>) {\r\n this._isInsert = true\r\n this._from = table\r\n this._insertData = data\r\n return this\r\n }\r\n\r\n builder.update = function(table: string, data: Record<string, SqlValue>) {\r\n this._isUpdate = true\r\n this._from = table\r\n this._updateData = data\r\n return this\r\n }\r\n\r\n builder.delete = function(table: string) {\r\n this._isDelete = true\r\n this._from = table\r\n return this\r\n }\r\n\r\n builder.raw = function(sql: string, params: SqlValue[] = []) {\r\n self.currentQuery = sql\r\n self.currentParams = params\r\n return this\r\n }\r\n\r\n builder.execute = function() {\r\n let sql = ''\r\n\r\n if (this._isInsert && this._insertData) {\r\n const columns = Object.keys(this._insertData)\r\n const placeholders = columns.map(() => '?').join(', ')\r\n sql = `INSERT INTO ${this._from} (${columns.join(', ')}) VALUES (${placeholders})`\r\n self.currentParams = Object.values(this._insertData)\r\n } else if (this._isUpdate && this._updateData) {\r\n const setClauses = Object.keys(this._updateData).map(col => `${col} = ?`)\r\n const updateValues = Object.values(this._updateData)\r\n self.currentParams = [...updateValues, ...self.currentParams] as SqlValue[]\r\n sql = `UPDATE ${this._from} SET ${setClauses.join(', ')}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n } else if (this._isDelete) {\r\n sql = `DELETE FROM ${this._from}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n } else {\r\n // SELECT query\r\n sql = `SELECT ${this._select.join(', ')} FROM ${this._from}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n\r\n if (this._orderBy) {\r\n sql += ` ${this._orderBy}`\r\n }\r\n\r\n if (this._limit !== null) {\r\n sql += ` LIMIT ${this._limit}`\r\n }\r\n\r\n if (this._offset !== null) {\r\n sql += ` OFFSET ${this._offset}`\r\n }\r\n }\r\n\r\n if (!sql && self.currentQuery) {\r\n sql = self.currentQuery\r\n }\r\n\r\n const stmt = self.db.query(sql)\r\n const result = stmt.all(...self.currentParams) as unknown[]\r\n self.reset()\r\n return result as any[]\r\n }\r\n\r\n builder.executeOne = function() {\r\n const results = this.execute()\r\n return results.length > 0 ? results[0] : null\r\n }\r\n\r\n builder.executeRaw = function(sql: string, params: SqlValue[] = []) {\r\n const stmt = self.db.query(sql)\r\n const result = stmt.all(...params) as unknown[]\r\n return result as any[]\r\n }\r\n\r\n return builder as QueryBuilder\r\n }\r\n\r\n private generateCreateTableSQL(schema: TableSchema): string {\r\n const columnDefs = schema.columns.map(col => {\r\n let def = `${col.name} ${col.type}`\r\n\r\n if (col.primaryKey) {\r\n def += ' PRIMARY KEY'\r\n if (col.autoIncrement) {\r\n def += ' AUTOINCREMENT'\r\n }\r\n }\r\n\r\n if (col.notNull && !col.primaryKey) {\r\n def += ' NOT NULL'\r\n }\r\n\r\n if (col.unique) {\r\n def += ' UNIQUE'\r\n }\r\n\r\n if (col.default !== undefined) {\r\n if (typeof col.default === 'string') {\r\n def += ` DEFAULT '${col.default}'`\r\n } else if (col.default === null) {\r\n def += ' DEFAULT NULL'\r\n } else {\r\n def += ` DEFAULT ${col.default}`\r\n }\r\n }\r\n\r\n if (col.references) {\r\n def += ` REFERENCES ${col.references.table}(${col.references.column})`\r\n }\r\n\r\n return def\r\n })\r\n\r\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${columnDefs.join(', ')})`\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n // ════════ Schema Builder Helpers ════════\r\n export function table(name: string, columns: ColumnDefinition[]): TableSchema {\r\n return { name, columns }\r\n }\r\n\r\n export function column(name: string, type: ColumnType): ColumnDefinition {\r\n return { name, type }\r\n }\r\n\r\n export function integer(name: string): ColumnDefinition {\r\n return { name, type: 'INTEGER' }\r\n }\r\n\r\n export function text(name: string): ColumnDefinition {\r\n return { name, type: 'TEXT' }\r\n }\r\n\r\n export function real(name: string): ColumnDefinition {\r\n return { name, type: 'REAL' }\r\n }\r\n\r\n export function blob(name: string): ColumnDefinition {\r\n return { name, type: 'BLOB' }\r\n }\r\n\r\n export function numeric(name: string): ColumnDefinition {\r\n return { name, type: 'NUMERIC' }\r\n }\r\n\r\n // ════════ Column Modifiers ════════\r\n export function primaryKey(col: ColumnDefinition, autoIncrement = false): ColumnDefinition {\r\n return { ...col, primaryKey: true, autoIncrement }\r\n }\r\n\r\n export function notNull(col: ColumnDefinition): ColumnDefinition {\r\n return { ...col, notNull: true }\r\n }\r\n\r\n export function unique(col: ColumnDefinition): ColumnDefinition {\r\n return { ...col, unique: true }\r\n }\r\n\r\n export function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition {\r\n return { ...col, default: value }\r\n }\r\n\r\n export function references(col: ColumnDefinition, table: string, column: string): ColumnDefinition {\r\n return { ...col, references: { table, column } }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/router.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n\texport interface RegexRoute {\r\n\t\tpattern\t\t: RegExp\r\n\t\tmethod\t\t: string\r\n\t\thandler\t\t: any\r\n\t\tkey\t\t\t: string\r\n\t}\r\n\r\n\texport type RegexRoutes = Array<RegexRoute>\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Router {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate routes \t\t\t= new Map<string, any>()\r\n\t\t\tprivate regexRoutes\t\t: RegexRoutes = []\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\tmatch(method: string, path: string): { handler: any; params: Record<string, string> } | null {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\t// Try static route first (faster)\r\n\t\t\t\tif (this.routes.has(key)) {\r\n\t\t\t\treturn { handler: this.routes.get(key), params: {} }\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Try dynamic routes\r\n\t\t\t\tfor (const route of this.regexRoutes) {\r\n\t\t\t\tif (route.method === method) {\r\n\t\t\t\t\tconst match = path.match(route.pattern)\r\n\t\t\t\t\tif (match?.groups) {\r\n\t\t\t\t\treturn { handler: route.handler, params: match.groups }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\tgetAll() {\r\n\t\t\t\tconst staticRoutes = Array.from(this.routes.entries()).map(([key, handler]) => {\r\n\t\t\t\tconst colonIndex = key.indexOf(':')\r\n\t\t\t\tconst method = key.substring(0, colonIndex)\r\n\t\t\t\tconst path = key.substring(colonIndex + 1)\r\n\t\t\t\treturn { method, path, handler }\r\n\t\t\t\t})\r\n\r\n\t\t\t\tconst dynamicRoutes = this.regexRoutes.map(route => {\r\n\t\t\t\tconst colonIndex = route.key.indexOf(':')\r\n\t\t\t\treturn {\r\n\t\t\t\t\tmethod: route.method,\r\n\t\t\t\t\tpath: route.key.substring(colonIndex + 1),\r\n\t\t\t\t\thandler: route.handler\r\n\t\t\t\t}\r\n\t\t\t\t})\r\n\r\n\t\t\t\treturn [...staticRoutes, ...dynamicRoutes]\r\n\t\t\t}\r\n\r\n\t\t\tclear() {\r\n\t\t\t\tthis.routes.clear()\r\n\t\t\t\tthis.regexRoutes = []\r\n\t\t\t}\r\n\r\n\t\t\tremove(method: string, path: string): boolean {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\tif (this.routes.has(key)) {\r\n\t\t\t\tthis.routes.delete(key)\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst index = this.regexRoutes.findIndex(r => r.key === key)\r\n\t\t\t\tif (index >= 0) {\r\n\t\t\t\tthis.regexRoutes.splice(index, 1)\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\tregister(method: string, path: string, handler: any, config: any = {}) {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\tif (path.includes(':')) {\r\n\t\t\t\t// Dynamic route with params\r\n\t\t\t\tconst pattern = this.pathToRegex(path)\r\n\r\n\t\t\t\t// Check if route already exists to prevent duplicates\r\n\t\t\t\tconst existingIndex = this.regexRoutes.findIndex(r => r.key === key)\r\n\r\n\t\t\t\tconst route = {\r\n\t\t\t\t\tpattern,\r\n\t\t\t\t\tmethod,\r\n\t\t\t\t\thandler,\r\n\t\t\t\t\tkey\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (existingIndex >= 0) {\r\n\t\t\t\t\t// Update existing route\r\n\t\t\t\t\tthis.regexRoutes[existingIndex] = route\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Add new route\r\n\t\t\t\t\tthis.regexRoutes.push(route)\r\n\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t// Static route\r\n\t\t\t\tthis.routes.set(key, handler)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n\t\t\tprivate pathToRegex(path: string): RegExp {\r\n\t\t\t\t// Escape special regex characters except ':'\r\n\t\t\t\tconst escaped = path.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n\t\t\t\t// Replace :param with named capture groups\r\n\t\t\t\tconst pattern = escaped.replace(/:(\\w+)/g, '(?<$1>[^/]+)')\r\n\t\t\t\treturn new RegExp(`^${pattern}$`)\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/security.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import crypto from 'crypto'\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class SecurityManager {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate rateLimitStore \t= new Map<string, { count: number; reset: number }>()\r\n\t\t\tprivate csrfTokens \t\t= new Map<string, { sessionId: string; expires: number }>()\r\n\t\t\tprivate requestLog\t\t= new Map<string, any>()\r\n\r\n\t\t\tprivate readonly MAX_REQUEST_LOG_SIZE = 1000\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\t// Rate Limiting with proper overflow handling\r\n\t\t\tcheckRateLimit(key: string, max: number, windowMs: number): boolean {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tconst record = this.rateLimitStore.get(key)\r\n\r\n\t\t\tif (record) {\r\n\t\t\t\tif (now < record.reset) {\r\n\t\t\t\t// Within the current window\r\n\t\t\t\tif (record.count >= max) {\r\n\t\t\t\t\treturn false // Rate limit exceeded\r\n\t\t\t\t}\r\n\t\t\t\trecord.count++\r\n\t\t\t\treturn true\r\n\t\t\t\t} else {\r\n\t\t\t\t// Window expired, reset\r\n\t\t\t\tthis.rateLimitStore.set(key, { count: 1, reset: now + windowMs })\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// First request for this key\r\n\t\t\t\tthis.rateLimitStore.set(key, { count: 1, reset: now + windowMs })\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Cleanup old rate limit records\r\n\t\t\tcleanupRateLimit() {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tfor (const [key, record] of this.rateLimitStore.entries()) {\r\n\t\t\t\tif (now > record.reset) {\r\n\t\t\t\tthis.rateLimitStore.delete(key)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// CSRF Token Generation with TTL\r\n\t\t\tgenerateCsrfToken(sessionId: string, ttl = 3600000): string {\r\n\t\t\tconst token = crypto.randomBytes(32).toString('hex')\r\n\t\t\tthis.csrfTokens.set(token, {\r\n\t\t\t\tsessionId,\r\n\t\t\t\texpires: Date.now() + ttl\r\n\t\t\t})\r\n\t\t\treturn token\r\n\t\t\t}\r\n\r\n\t\t\t// Validate CSRF Token with expiration check\r\n\t\t\tvalidateCsrfToken(token: string, sessionId: string): boolean {\r\n\t\t\tconst stored = this.csrfTokens.get(token)\r\n\r\n\t\t\tif (!stored) {\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Check if token has expired\r\n\t\t\tif (Date.now() > stored.expires) {\r\n\t\t\t\tthis.csrfTokens.delete(token)\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Validate session ID\r\n\t\t\tif (stored.sessionId === sessionId) {\r\n\t\t\t\tthis.csrfTokens.delete(token) // One-time use\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\r\n\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Cleanup expired CSRF tokens\r\n\t\t\tcleanupCsrfTokens() {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tfor (const [token, data] of this.csrfTokens.entries()) {\r\n\t\t\t\tif (now > data.expires) {\r\n\t\t\t\tthis.csrfTokens.delete(token)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// HTML Sanitization - comprehensive\r\n\t\t\tsanitizeHtml(html: string): string {\r\n\t\t\tif (!html) return ''\r\n\r\n\t\t\treturn html\r\n\t\t\t\t.replace(/&/g, '&amp;')\r\n\t\t\t\t.replace(/</g, '&lt;')\r\n\t\t\t\t.replace(/>/g, '&gt;')\r\n\t\t\t\t.replace(/\"/g, '&quot;')\r\n\t\t\t\t.replace(/'/g, '&#x27;')\r\n\t\t\t\t.replace(/\\//g, '&#x2F;')\r\n\t\t\t}\r\n\r\n\t\t\t// SQL Injection Prevention\r\n\t\t\tsanitizeSql(input: string): string {\r\n\t\t\tif (!input) return ''\r\n\r\n\t\t\treturn input\r\n\t\t\t\t.replace(/\\\\/g, '\\\\\\\\') // Escape backslashes first\r\n\t\t\t\t.replace(/;/g, '') // Remove semicolons to prevent multi-statement injection\r\n\t\t\t\t.replace(/'/g, \"''\") // Escape single quotes (SQL standard)\r\n\t\t\t\t.replace(/\"/g, '\\\\\"') // Escape double quotes\r\n\t\t\t\t.replace(/\\x00/g, '') // Remove null bytes\r\n\t\t\t}\r\n\r\n\t\t\t// Log request for audit trail with size limit\r\n\t\t\tlogRequest(\r\n\t\t\tid: string,\r\n\t\t\tmethod: string,\r\n\t\t\tpath: string,\r\n\t\t\tip: string,\r\n\t\t\tstatus: number,\r\n\t\t\tduration: number\r\n\t\t\t) {\r\n\t\t\tthis.requestLog.set(id, {\r\n\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\tmethod,\r\n\t\t\t\tpath,\r\n\t\t\t\tip,\r\n\t\t\t\tstatus,\r\n\t\t\t\tduration\r\n\t\t\t})\r\n\r\n\t\t\t// Keep only last MAX_REQUEST_LOG_SIZE requests\r\n\t\t\tif (this.requestLog.size > this.MAX_REQUEST_LOG_SIZE) {\r\n\t\t\t\tconst { value: first } = this.requestLog.keys().next() || { value: null }\r\n\t\t\t\tif (first) {\r\n\t\t\t\tthis.requestLog.delete(first)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Get request log by ID\r\n\t\t\tgetRequestLog(id: string) {\r\n\t\t\treturn this.requestLog.get(id)\r\n\t\t\t}\r\n\r\n\t\t\t// Get all request logs\r\n\t\t\tgetAllRequestLogs() {\r\n\t\t\treturn Array.from(this.requestLog.values())\r\n\t\t\t}\r\n\r\n\t\t\t// Clear all\r\n\t\t\tclearAll() {\r\n\t\t\tthis.rateLimitStore.clear()\r\n\t\t\tthis.csrfTokens.clear()\r\n\t\t\tthis.requestLog.clear()\r\n\t\t\t}\r\n\r\n\t\t\t// Get stats\r\n\t\t\tgetStats() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\trateLimitEntries: this.rateLimitStore.size,\r\n\t\t\t\t\tcsrfTokens: this.csrfTokens.size,\r\n\t\t\t\t\trequestLogs: this.requestLog.size\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/logger.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n\texport class Logger {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate level\t: number \t= 1\r\n\t\t\tprivate pretty\t: boolean \t= false\r\n\t\t\tprivate levels\t\t\t\t= { debug: 0, info: 1, warn: 2, error: 3, fatal: 4 }\r\n\r\n\t\t\tconstructor(level: 'debug' | 'info' | 'warn' | 'error' = 'info', pretty = false) {\r\n\t\t\t\tthis.level \t= this.levels[level] ?? 1\r\n\t\t\t\tthis.pretty = pretty\r\n\t\t\t}\r\n\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\tdebug(data: any, msg?: string) {\r\n\t\t\t\tthis.log('debug', this.levels.debug, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\tinfo(data: any, msg?: string) {\r\n\t\t\t\tthis.log('info', this.levels.info, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\twarn(data: any, msg?: string) {\r\n\t\t\t\tthis.log('warn', this.levels.warn, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\terror(data: any, msg?: string) {\r\n\t\t\t\tthis.log('error', this.levels.error, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\tfatal(data: any, msg?: string) {\r\n\t\t\t\tthis.log('fatal', this.levels.fatal, data, msg)\r\n\t\t\t\t// Fatal errors might need additional handling in production\r\n\t\t\t\tif (process.env.NODE_ENV === 'production') {\r\n\t\t\t\t\t// Could send to external logging service here\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n\t\t\tprivate log(level: string, levelNum: number, data: any, msg?: string) {\r\n\t\t\t\tif (levelNum < this.level) return\r\n\r\n\t\t\t\tconst ts = new Date().toISOString()\r\n\r\n\t\t\t\t// Handle null/undefined data gracefully\r\n\t\t\t\tconst safeData = data ?? {}\r\n\r\n\t\t\t\tconst output = {\r\n\t\t\t\t\ttimestamp\t: ts,\r\n\t\t\t\t\tlevel\t\t: level.toUpperCase(),\r\n\t\t\t\t\tmessage\t\t: msg || 'No message',\r\n\t\t\t\t\t...safeData\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst str = this.pretty\r\n\t\t\t\t? `[${ts}] ${level.toUpperCase()} ${msg || 'No message'}\\n${JSON.stringify(safeData, null, 2)}`\r\n\t\t\t\t: JSON.stringify(output)\r\n\r\n\t\t\t\tif (level === 'error' || level === 'fatal') {\r\n\t\t\t\t\tconsole.error(str)\r\n\t\t\t\t} else if (level === 'warn') {\r\n\t\t\t\t\tconsole.warn(str)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log(str)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\t}\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/types.d.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD'\r\n export type RouteHandler = (c: AppContext) => any | Promise<any>\r\n export type AppMiddleware = (c: AppContext, next: () => Promise<void>) => void | Promise<void>\r\n\r\n export interface AppContext {\r\n request : Request\r\n params : Record<string, string>\r\n query : Record<string, any>\r\n body : any\r\n headers : Headers\r\n db : any\r\n logger : Logger | null\r\n user? : any\r\n requestId : string\r\n\r\n // Response methods\r\n json (data: any, status?: number): Response\r\n text (data: string, status?: number): Response\r\n html (data: string, status?: number): Response\r\n redirect (url: string, status?: number): Response\r\n file (path: string, contentType?: string): Response\r\n\r\n // Cookie methods\r\n setCookie (name: string, value: string, options?: CookieOptions): AppContext\r\n getCookie (name: string): string | undefined\r\n deleteCookie (name: string, options?: Partial<CookieOptions>): AppContext\r\n\r\n // Header methods\r\n setHeader(key: string, value: string): AppContext\r\n getHeader(key: string): string | undefined\r\n\r\n // Status code\r\n status(code: number): AppContext\r\n statusCode: number\r\n }\r\n\r\n export interface CookieOptions {\r\n maxAge? : number\r\n expires? : Date\r\n path? : string\r\n domain? : string\r\n secure? : boolean\r\n httpOnly? : boolean\r\n sameSite? : 'Strict' | 'Lax' | 'None'\r\n }\r\n\r\n export interface RouteDefinition {\r\n method : HttpMethod | HttpMethod[]\r\n path : string\r\n handler : RouteHandler\r\n validate? : { body?: any, query?: any, params?: any }\r\n middlewares? : AppMiddleware[]\r\n timeout? : number\r\n rateLimit? : { max: number; windowMs: number }\r\n cache? : number\r\n tags? : string[]\r\n }\r\n\r\n export interface DatabaseConfig {\r\n name? : string\r\n connection : string // File path or ':memory:'\r\n schema? : Record<string, any>\r\n timeout? : number\r\n }\r\n\r\n export interface SecurityConfig {\r\n cors? : boolean | CorsConfig\r\n rateLimit? : boolean | RateLimitConfig\r\n csrf? : boolean | CsrfConfig\r\n helmet? : boolean | HelmetConfig\r\n auth? : boolean | AuthConfig\r\n validation? : boolean\r\n sanitize? : boolean\r\n }\r\n\r\n export interface CorsConfig {\r\n origin? : string | string[] | ((origin: string) => boolean)\r\n methods? : HttpMethod[]\r\n allowedHeaders? : string[]\r\n credentials? : boolean\r\n maxAge? : number\r\n }\r\n\r\n export interface RateLimitConfig {\r\n windowMs? : number\r\n max? : number\r\n keyGenerator? : (c: AppContext) => string\r\n message? : string\r\n }\r\n\r\n export interface CsrfConfig {\r\n secret? : string\r\n headerName? : string\r\n tokenTTL? : number\r\n }\r\n\r\n export interface HelmetConfig {\r\n contentSecurityPolicy? : Record<string, string[]> | boolean\r\n hsts? : boolean | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean }\r\n frameguard? : boolean | { action: 'deny' | 'sameorigin' }\r\n noSniff? : boolean\r\n xssFilter? : boolean\r\n referrerPolicy? : string | boolean\r\n }\r\n\r\n export interface AuthConfig {\r\n jwt? : boolean | { secret: string; expiresIn?: string }\r\n apiKey? : boolean | { header?: string }\r\n bearer? : boolean\r\n }\r\n\r\n export interface ServerConfig {\r\n port? : number | string\r\n hostname? : string\r\n requestTimeout? : number\r\n maxRequestSize? : number\r\n maxJsonSize? : number\r\n\r\n database? : DatabaseConfig | DatabaseConfig[]\r\n\r\n security? : boolean | SecurityConfig\r\n\r\n compression? : boolean | { threshold?: number }\r\n\r\n logging? : boolean | { level?: 'debug' | 'info' | 'warn' | 'error'; pretty?: boolean }\r\n\r\n routes? : RouteDefinition[]\r\n middlewares? : AppMiddleware[]\r\n\r\n errorHandler? : (error: Error, context: AppContext) => void | Promise<void>\r\n onShutdown? : () => void | Promise<void>\r\n\r\n apiPrefix? : string\r\n apiVersion? : string\r\n\r\n gracefulShutdownTimeout?: number\r\n }\r\n\r\n export interface ServerInstance {\r\n app : any\r\n logger : Logger | null\r\n db : Map<string, any>\r\n bunServer : any\r\n start : () => Promise<void>\r\n stop : () => Promise<void>\r\n addRoute : (route: RouteDefinition) => void\r\n getRoutes : () => RouteDefinition[]\r\n }\r\n\r\n export interface Logger {\r\n debug (data: any, msg?: string): void\r\n info (data: any, msg?: string): void\r\n warn (data: any, msg?: string): void\r\n error (data: any, msg?: string): void\r\n fatal (data: any, msg?: string): void\r\n }\r\n\r\n export class AppError extends Error {\r\n constructor(public message: string, public statusCode: number = 500, public code?: string) {\r\n super(message)\r\n this.name = 'AppError'\r\n }\r\n }\r\n\r\n export class ValidationError extends AppError {\r\n constructor(message: string, public issues?: any) {\r\n super(message, 400, 'VALIDATION_ERROR')\r\n this.name = 'ValidationError'\r\n }\r\n }\r\n\r\n export class DatabaseError extends AppError {\r\n constructor(message: string) {\r\n super(message, 500, 'DATABASE_ERROR')\r\n this.name = 'DatabaseError'\r\n }\r\n }\r\n\r\n export class TimeoutError extends AppError {\r\n constructor(message = 'Request timeout') {\r\n super(message, 408, 'TIMEOUT_ERROR')\r\n this.name = 'TimeoutError'\r\n }\r\n }\r\n\r\n export class RateLimitError extends AppError {\r\n constructor(message = 'Too many requests') {\r\n super(message, 429, 'RATE_LIMIT_ERROR')\r\n this.name = 'RateLimitError'\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/main.ts\n//\n// Developed with ❤️ by Maysara.\n\n\n\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\n\n import { DB } from './mod/db'\n import { Router } from './mod/router'\n import { SecurityManager } from './mod/security'\n import { Logger } \tfrom './mod/logger'\n import * as types from './types.d'\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\n\n const security = new SecurityManager()\n const router = new Router()\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\n\n export function server(config: types.ServerConfig = {}): types.ServerInstance {\n\n\t\t// ════════ Configuration ════════\n\t\tconst port = Number(config.port) || 3000\n\t\tconst hostname = config.hostname || 'localhost'\n\t\tconst maxReqSize = config.maxRequestSize || 10 * 1024 * 1024\n\t\tconst requestTimeout = config.requestTimeout || 30000\n\t\tconst gracefulShutdownTimeout = config.gracefulShutdownTimeout || 10000\n\n\t\tconst logCfg = typeof config.logging === 'object' ? config.logging : {}\n\t\tconst logger = config.logging ? new Logger(logCfg.level || 'info', logCfg.pretty) : null\n\n\t\tconst dbs = new Map<string, any>()\n\t\tconst routes: types.RouteDefinition[] = []\n\t\tconst activeRequests = new Set<string>()\n\n\t\t// ════════ Cleanup intervals ════════\n const cleanupInterval = setInterval(() => {\n security.cleanupRateLimit()\n security.cleanupCsrfTokens()\n }, 2 * 60 * 1000)\n\n async function handleRequest(request: Request): Promise<Response> {\n const startTime = Date.now()\n const requestId = crypto.randomUUID()\n const url = new URL(request.url)\n const path = url.pathname\n const method = request.method.toUpperCase()\n const ip = getClientIp(request)\n\n activeRequests.add(requestId)\n\n try {\n // Check request size from header\n const contentLength = request.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > maxReqSize) {\n\n logger?.warn({ requestId, size: contentLength, ip }, 'Request too large')\n\n return new Response(JSON.stringify({ error: 'Payload too large' }), {\n\t\t\t\t\t\tstatus\t: 413,\n\t\t\t\t\t\theaders\t: { 'Content-Type': 'application/json' }\n })\n }\n\n // CORS handling\n const corsHeaders = handleCors(request, config)\n if (method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders })\n }\n\n // Rate limiting\n if (config.security && typeof config.security === 'object' && config.security.rateLimit) {\n const rateLimitCfg = typeof config.security.rateLimit === 'object'\n ? config.security.rateLimit\n : {}\n const max = rateLimitCfg.max || 100\n const windowMs = rateLimitCfg.windowMs || 60000\n const rateLimitKey = rateLimitCfg.keyGenerator\n ? rateLimitCfg.keyGenerator({ request, ip } as any)\n : ip\n\n if (!security.checkRateLimit(rateLimitKey, max, windowMs)) {\n logger?.warn({ requestId, ip, key: rateLimitKey }, 'Rate limit exceeded')\n return new Response(\n JSON.stringify({ error: rateLimitCfg.message || 'Too many requests' }),\n { status: 429, headers: { 'Content-Type': 'application/json' } }\n )\n }\n }\n\n // Parse body\n let body: any = null\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n body = await parseBody(request, logger, maxReqSize)\n }\n\n // Get database\n const defaultDb = dbs.get('default')\n\n // Match route\n const routeMatch = router.match(method, path)\n if (!routeMatch) {\n const ctx = createAppContext(request, {}, defaultDb, logger, requestId)\n logger?.warn({ requestId, method, path, ip }, 'Route not found')\n return ctx.json({ error: 'Not Found', path }, 404)\n }\n\n const ctx = createAppContext(request, routeMatch.params || {}, defaultDb, logger, requestId)\n ctx.body = body\n ctx.request = request\n\n // Execute route handler with timeout\n const controller = new AbortController()\n const timeoutPromise = new Promise<never>((_, reject) => {\n const id = setTimeout(() => {\n controller.abort()\n reject(new types.TimeoutError('Request timeout'))\n }, requestTimeout)\n controller.signal.addEventListener('abort', () => clearTimeout(id))\n })\n\n const response = await Promise.race([\n routeMatch.handler(ctx),\n timeoutPromise\n ]) as Response\n\n // Merge CORS and security headers\n const resHeaders = new Headers(response.headers)\n corsHeaders.forEach((value, key) => {\n if (!resHeaders.has(key)) resHeaders.set(key, value)\n })\n\n resHeaders.set('X-Request-ID', requestId)\n resHeaders.set('X-Content-Type-Options', 'nosniff')\n resHeaders.set('X-Frame-Options', 'DENY')\n resHeaders.set('X-XSS-Protection', '1; mode=block')\n resHeaders.set('Referrer-Policy', 'strict-origin-when-cross-origin')\n\n // Audit log\n const duration = Date.now() - startTime\n security.logRequest(requestId, method, path, ip, response.status, duration)\n logger?.info({\n requestId,\n method,\n path,\n status: response.status,\n duration,\n ip\n }, 'Request completed')\n\n return new Response(response.body, {\n status: response.status,\n headers: resHeaders\n })\n } catch (error) {\n if (error instanceof types.AppError) {\n logger?.warn({ error: error.message, requestId, ip }, `App error: ${error.message}`)\n return new Response(\n JSON.stringify({\n error\t: error.message,\n code\t: error.code,\n requestId\n }),\n { status: error.statusCode, headers: { 'Content-Type': 'application/json' } }\n )\n }\n\n logger?.error({ error: String(error), requestId, ip }, 'Unhandled error')\n\n const errorMessage = process.env.NODE_ENV === 'production'\n ? 'Internal Server Error'\n : (error as Error).message\n\n return new Response(\n JSON.stringify({ error: errorMessage, requestId }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n )\n } finally {\n activeRequests.delete(requestId)\n }\n }\n\n // ════════ Health & Readiness routes ════════\n const healthRoute: types.RouteDefinition = {\n method : 'GET',\n path : '/health',\n handler : (c: types.AppContext) => c.json({\n status : 'healthy',\n timestamp : new Date().toISOString(),\n uptime : process.uptime(),\n activeRequests : activeRequests.size\n })\n }\n\n const readinessRoute: types.RouteDefinition = {\n method : 'GET',\n path : '/readiness',\n handler : (c: types.AppContext) => {\n const dbConnected = dbs.size > 0\n const ready = dbConnected || dbs.size === 0\n return c.json({\n ready,\n checks : {\n database : dbConnected ? 'connected' : 'not configured',\n activeRequests : activeRequests.size\n },\n timestamp: new Date().toISOString()\n }, ready ? 200 : 503)\n }\n }\n\n // ════════ Register routes ════════\n if (config.routes) {\n config.routes.forEach(route => {\n routes.push(route)\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n methods.forEach(m => {\n router.register(m, route.path, route.handler, route)\n })\n })\n }\n\n routes.push(healthRoute, readinessRoute)\n router.register('GET', '/health', healthRoute.handler, healthRoute)\n router.register('GET', '/readiness', readinessRoute.handler, readinessRoute)\n\n let bunServer: any = null\n\n const instance: types.ServerInstance = {\n app : null,\n logger,\n db : dbs,\n bunServer : null,\n\n async start() {\n // Initialize databases with our custom DB solution\n if (config.database) {\n const dbConfigs = Array.isArray(config.database) ? config.database : [config.database]\n for (const dbCfg of dbConfigs) {\n const dbName = dbCfg.name || 'default'\n\n try {\n if (typeof dbCfg.connection === 'string') {\n // Create DB instance with connection string\n const db = new DB(dbCfg.connection)\n\n // Define schemas if provided\n if (dbCfg.schema && typeof dbCfg.schema === 'object') {\n for (const [tableName, tableSchema] of Object.entries(dbCfg.schema)) {\n if (tableSchema && typeof tableSchema === 'object') {\n db.defineSchema(tableSchema as any)\n }\n }\n }\n\n dbs.set(dbName, db)\n\n logger?.info({\n name: dbName,\n connection: dbCfg.connection\n }, '✅ Database connected')\n } else {\n throw new Error(`Database connection must be a string path (got ${typeof dbCfg.connection})`)\n }\n } catch (error) {\n logger?.error({\n error: String(error),\n name: dbName\n }, 'Failed to connect to database')\n throw error\n }\n }\n }\n\n bunServer = Bun.serve({ port, hostname, fetch: handleRequest })\n instance.bunServer = bunServer\n\n const url = `http://${hostname}:${port}`\n console.log(\n `→ URL: ${url}` + `\\n` +\n `→ Environment: ${(process.env.NODE_ENV || 'development')}` + `\\n` +\n `→ Routes: ${routes.length.toString()}` + `\\n` +\n `→ Database: ${(dbs.size > 0 ? '✅ Connected' : '❌ None')}` + `\\n` +\n `→ Security: ${(config.security ? '✅ ENABLED' : '❌ Disabled')}` + `\\n` +\n `\\n` +\n `🔍 Health: ${url}/health` + `\\n` +\n `🔍 Ready: ${url}/readiness`+ `\\n`\n )\n\n logger?.info({ url }, 'Server started')\n },\n\n async stop() {\n logger?.info('Stopping server...')\n\n // Wait for active requests to complete\n if (activeRequests.size > 0) {\n logger?.info({ count: activeRequests.size }, 'Waiting for active requests...')\n const deadline = Date.now() + gracefulShutdownTimeout\n\n while (activeRequests.size > 0 && Date.now() < deadline) {\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n if (activeRequests.size > 0) {\n logger?.warn({ count: activeRequests.size }, 'Force closing with active requests')\n }\n }\n\n clearInterval(cleanupInterval)\n\n if (config.onShutdown) {\n try {\n await config.onShutdown()\n } catch (e) {\n logger?.error({ error: String(e) }, 'Error in shutdown handler')\n }\n }\n\n // Close database connections\n for (const [name, db] of dbs.entries()) {\n try {\n if (db && typeof db.close === 'function') {\n db.close()\n }\n logger?.info({ name }, 'Database closed')\n } catch (e) {\n logger?.error({ error: String(e), name }, 'Error closing database')\n }\n }\n\n if (bunServer) {\n bunServer.stop()\n logger?.info('Bun server stopped')\n }\n\n logger?.info('Server stopped successfully')\n },\n\n addRoute(route: types.RouteDefinition) {\n routes.push(route)\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n methods.forEach(m => {\n router.register(m, route.path, route.handler, route)\n })\n logger?.info({ method: route.method, path: route.path }, 'Route added')\n },\n\n getRoutes() {\n return routes\n }\n }\n\n return instance\n\t}\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\n\n // Better body parsing with size validation\n async function parseBody(\n request : Request,\n logger : Logger | null,\n maxSize : number\n ): Promise<any> {\n const contentType = request.headers.get('content-type') || ''\n\n try {\n if (contentType.includes('application/json')) {\n\t\t\t\tconst text = await request.text()\n\n\t\t\t\t// Validate size after reading\n\t\t\t\tif (text.length > maxSize) {\n\t\t\t\t\tthrow new types.ValidationError('Payload too large')\n\t\t\t\t}\n\n\t\t\t\tif (!text.trim()) return {}\n\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(text)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlogger?.warn({\n\t\t\t\t\t\terror\t\t: String(e),\n\t\t\t\t\t\tbodyPreview\t: text.substring(0, 100)\n\t\t\t\t\t}, 'Invalid JSON in request body')\n\n\t\t\t\t\tthrow new types.ValidationError('Invalid JSON in request body')\n\t\t\t\t}\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const text = await request.text()\n if (text.length > maxSize) {\n throw new types.ValidationError('Payload too large')\n }\n\n return Object.fromEntries(new URLSearchParams(text))\n }\n\n if (contentType.includes('multipart/form-data')) {\n // Note: FormData size can't be validated before parsing\n return await request.formData()\n }\n\n } catch (e) {\n if (e instanceof types.ValidationError) throw e\n logger?.error({ error: String(e) }, 'Error parsing request body')\n throw new types.ValidationError('Failed to parse request body')\n }\n\n return {}\n }\n\n // Better cookie parsing\n function parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = new Map<string, string>()\n\n if (!cookieHeader) return cookies\n\n const pairs = cookieHeader.split(';')\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.trim().split('=')\n if (key) {\n const value = valueParts.join('=') // Handle '=' in value\n cookies.set(key, value ? decodeURIComponent(value) : '')\n }\n }\n\n return cookies\n }\n\n // Create app context with request ID\n function createAppContext(\n request : Request,\n params : Record<string, string>,\n db : any,\n logger : Logger | null,\n requestId : string\n ): types.AppContext {\n const url = new URL(request.url)\n const query = Object.fromEntries(url.searchParams)\n const headers = request.headers\n let statusCode = 200\n const cookieStore = new Map<string, string>()\n const parsedCookies = parseCookies(headers.get('cookie') || '')\n\n const ctx: any = {\n request,\n params,\n query,\n headers,\n db,\n logger,\n requestId,\n get statusCode() { return statusCode },\n set statusCode(code: number) { statusCode = code },\n body: null,\n\n json(data: any, status?: number): Response {\n return new Response(JSON.stringify(data), {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'application/json',\n ...this._setCookieHeaders()\n }\n })\n },\n\n text(data: string, status?: number): Response {\n return new Response(data, {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'text/plain',\n ...this._setCookieHeaders()\n }\n })\n },\n\n html(data: string, status?: number): Response {\n return new Response(data, {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'text/html; charset=utf-8',\n ...this._setCookieHeaders()\n }\n })\n },\n\n redirect(url: string, status = 302): Response {\n return new Response(null, {\n status,\n headers : {\n Location : url,\n ...this._setCookieHeaders()\n }\n })\n },\n\n file(path: string, contentType = 'application/octet-stream'): Response {\n const file = Bun.file(path)\n return new Response(file, {\n headers: {\n 'Content-Type': contentType,\n ...this._setCookieHeaders()\n }\n })\n },\n\n setCookie(name: string, value: string, options: types.CookieOptions = {}): types.AppContext {\n let cookie = `${name}=${encodeURIComponent(value)}`\n\n if (options.maxAge !== undefined) {\n cookie += `; Max-Age=${options.maxAge}`\n }\n if (options.expires) {\n cookie += `; Expires=${options.expires.toUTCString()}`\n }\n if (options.path) {\n cookie += `; Path=${options.path}`\n }\n if (options.domain) {\n cookie += `; Domain=${options.domain}`\n }\n if (options.secure) {\n cookie += '; Secure'\n }\n if (options.httpOnly) {\n cookie += '; HttpOnly'\n }\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite}`\n }\n\n cookieStore.set(name, cookie)\n return ctx\n },\n\n getCookie(name: string): string | undefined {\n return parsedCookies.get(name)\n },\n\n deleteCookie(name: string, options: Partial<types.CookieOptions> = {}): types.AppContext {\n return ctx.setCookie(name, '', {\n ...options,\n maxAge: 0,\n path: options.path || '/'\n })\n },\n\n setHeader(key: string, value: string): types.AppContext {\n headers.set(key, value)\n return ctx\n },\n\n getHeader(key: string): string | undefined {\n return headers.get(key) || undefined\n },\n\n status(code: number): types.AppContext {\n statusCode = code\n return ctx\n },\n\n _setCookieHeaders(): Record<string, string | string[]> {\n const h: any = {}\n if (cookieStore.size > 0) {\n h['Set-Cookie'] = Array.from(cookieStore.values())\n }\n return h\n }\n }\n\n return ctx\n }\n\n // Better IP extraction\n function getClientIp(request: Request): string {\n const forwarded = request.headers.get('x-forwarded-for')\n\n if (forwarded) {\n const ips = forwarded.split(',').map(ip => ip.trim())\n return ips[0] || 'unknown'\n }\n\n const realIp = request.headers.get('x-real-ip')\n if (realIp) return realIp\n return 'unknown'\n }\n\n // CORS helper with proper configuration\n function handleCors(request: Request, config: types.ServerConfig): Headers {\n const headers = new Headers()\n\n if (!config.security || typeof config.security !== 'object' || !config.security.cors) {\n return headers\n }\n\n const corsConfig = typeof config.security.cors === 'object' ? config.security.cors : {}\n const origin = request.headers.get('Origin')\n\n if (origin) {\n if (typeof corsConfig.origin === 'function') {\n if (corsConfig.origin(origin)) {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n } else if (Array.isArray(corsConfig.origin)) {\n if (corsConfig.origin.includes(origin)) {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n } else if (typeof corsConfig.origin === 'string') {\n headers.set('Access-Control-Allow-Origin', corsConfig.origin)\n } else {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n\n const methods = corsConfig.methods || ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']\n headers.set('Access-Control-Allow-Methods', methods.join(', '))\n\n const allowedHeaders = corsConfig.allowedHeaders || ['Content-Type', 'Authorization', 'X-Requested-With']\n headers.set('Access-Control-Allow-Headers', allowedHeaders.join(', '))\n\n if (corsConfig.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true')\n }\n\n if (corsConfig.maxAge) {\n headers.set('Access-Control-Max-Age', corsConfig.maxAge.toString())\n }\n }\n\n return headers\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\n\n // Export all types\n export * from './types.d';\n\n // Export Logger\n export { Logger };\n\n // Export SecurityManager for advanced use cases\n export { SecurityManager };\n\n // Export Router for advanced use cases\n export { Router };\n\n // Export DB and database helpers\n export {\n DB,\n table,\n column,\n integer,\n text,\n real,\n blob,\n numeric,\n primaryKey,\n notNull,\n unique,\n defaultValue,\n references\n } from './mod/db';\n\n // Export DB types\n export type {\n ColumnType,\n SqlValue,\n ColumnDefinition,\n TableSchema,\n WhereCondition,\n QueryBuilder\n } from './mod/db';\n\n // Default export\n export default server;\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
1
+ {"version":3,"sources":["../src/mod/db.ts","../src/mod/router.ts","../src/mod/security.ts","../src/mod/logger.ts","../src/types.d.ts","../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","direction","count","setClauses","col","updateValues","result","results","columnDefs","def","name","type","integer","text","real","blob","numeric","primaryKey","autoIncrement","notNull","unique","defaultValue","references","Router","method","key","route","match","staticRoutes","handler","colonIndex","dynamicRoutes","r","config","pattern","existingIndex","SecurityManager","max","windowMs","now","record","sessionId","ttl","token","crypto","stored","html","input","ip","status","duration","first","Logger","level","pretty","msg","levelNum","safeData","output","str","c","time","methods","icon","color","keys","k","parts","m","s","AppError","message","statusCode","code","ValidationError","issues","DatabaseError","TimeoutError","RateLimitError","security","router","server","port","hostname","maxReqSize","requestTimeout","gracefulShutdownTimeout","logCfg","logger","dbs","routes","activeRequests","cleanupInterval","handleRequest","request","startTime","requestId","getClientIp","contentLength","corsHeaders","handleCors","rateLimitCfg","rateLimitKey","body","parseBody","defaultDb","routeMatch","ctx","createAppContext","controller","timeoutPromise","_","reject","response","resHeaders","errorMessage","healthRoute","readinessRoute","dbConnected","ready","bunServer","instance","dbConfigs","dbCfg","dbName","db","tableSchema","url","deadline","resolve","e","maxSize","contentType","parseCookies","cookieHeader","cookies","pairs","pair","valueParts","query","headers","cookieStore","parsedCookies","file","options","cookie","h","forwarded","realIp","corsConfig","origin","allowedHeaders","main_default"],"mappings":"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","file":"main.cjs","sourcesContent":["// src/mod/db.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Database } from 'bun:sqlite'\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type ColumnType = 'INTEGER' | 'TEXT' | 'REAL' | 'BLOB' | 'NUMERIC'\r\n export type SqlValue = string | number | boolean | null | Uint8Array\r\n\r\n export interface ColumnDefinition {\r\n name : string\r\n type : ColumnType\r\n primaryKey? : boolean\r\n autoIncrement? : boolean\r\n notNull? : boolean\r\n unique? : boolean\r\n default? : SqlValue\r\n references? : { table: string; column: string }\r\n }\r\n\r\n export interface TableSchema {\r\n name : string\r\n columns : ColumnDefinition[]\r\n indexes? : { name: string; columns: string[]; unique?: boolean }[]\r\n }\r\n\r\n export interface WhereCondition {\r\n column : string\r\n operator : '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'IN' | 'IS NULL' | 'IS NOT NULL'\r\n value? : SqlValue | SqlValue[]\r\n }\r\n\r\n export interface QueryBuilder {\r\n select : (columns?: string[]) => QueryBuilder\r\n from : (table: string) => QueryBuilder\r\n where : (condition: WhereCondition | WhereCondition[]) => QueryBuilder\r\n and : (condition: WhereCondition) => QueryBuilder\r\n or : (condition: WhereCondition) => QueryBuilder\r\n orderBy : (column: string, direction?: 'ASC' | 'DESC') => QueryBuilder\r\n limit : (count: number) => QueryBuilder\r\n offset : (count: number) => QueryBuilder\r\n insert : (table: string, data: Record<string, SqlValue>) => QueryBuilder\r\n update : (table: string, data: Record<string, SqlValue>) => QueryBuilder\r\n delete : (table: string) => QueryBuilder\r\n execute : () => any[]\r\n executeOne : () => any | null\r\n executeRaw : (sql: string, params?: SqlValue[]) => any[]\r\n raw : (sql: string, params?: SqlValue[]) => QueryBuilder\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class DB {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private db : Database\r\n private schemas : Map<string, TableSchema> = new Map()\r\n private currentQuery : string = ''\r\n private currentParams : SqlValue[] = []\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── CORE ──────────────────────────────┐\r\n\r\n constructor(path: string = ':memory:') {\r\n this.db = new Database(path)\r\n this.db.exec('PRAGMA foreign_keys = ON')\r\n }\r\n\r\n close() {\r\n this.db.close()\r\n }\r\n\r\n // ════════ Schema Management ════════\r\n defineSchema(schema: TableSchema): void {\r\n this.schemas.set(schema.name, schema)\r\n const sql = this.generateCreateTableSQL(schema)\r\n this.db.exec(sql)\r\n\r\n // Create indexes\r\n if (schema.indexes) {\r\n for (const index of schema.indexes) {\r\n const uniqueStr = index.unique ? 'UNIQUE' : ''\r\n const indexSql = `CREATE ${uniqueStr} INDEX IF NOT EXISTS ${index.name} ON ${schema.name} (${index.columns.join(', ')})`\r\n this.db.exec(indexSql)\r\n }\r\n }\r\n }\r\n\r\n getSchema(tableName: string): TableSchema | undefined {\r\n return this.schemas.get(tableName)\r\n }\r\n\r\n listTables(): string[] {\r\n const result = this.db.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").all()\r\n return result.map((r: any) => r.name)\r\n }\r\n\r\n dropTable(tableName: string): void {\r\n this.db.exec(`DROP TABLE IF EXISTS ${tableName}`)\r\n this.schemas.delete(tableName)\r\n }\r\n\r\n // ════════ Query Builder ════════\r\n query(): QueryBuilder {\r\n this.reset()\r\n return this.createQueryBuilder()\r\n }\r\n\r\n // ════════ Quick Operations ════════\r\n find(table: string, conditions: Record<string, SqlValue>): any[] {\r\n const whereConditions: WhereCondition[] = Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n }))\r\n\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(whereConditions)\r\n .execute()\r\n }\r\n\r\n findOne(table: string, conditions: Record<string, SqlValue>): any | null {\r\n return this.query()\r\n .select()\r\n .from(table)\r\n .where(Object.entries(conditions).map(([column, value]) => ({\r\n column,\r\n operator: '=' as const,\r\n value\r\n })))\r\n .limit(1)\r\n .executeOne()\r\n }\r\n\r\n findById(table: string, id: number | string): any | null {\r\n return this.findOne(table, { id })\r\n }\r\n\r\n all(table: string): any[] {\r\n return this.query().select().from(table).execute()\r\n }\r\n\r\n insert(table: string, data: Record<string, SqlValue>): any {\r\n this.query().insert(table, data).execute()\r\n\r\n // Return inserted row\r\n const lastId = this.db.query('SELECT last_insert_rowid() as id').get() as any\r\n return this.findById(table, lastId.id)\r\n }\r\n\r\n update(table: string, id: number | string, data: Record<string, SqlValue>): any | null {\r\n this.query()\r\n .update(table, data)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute()\r\n\r\n return this.findById(table, id)\r\n }\r\n\r\n delete(table: string, id: number | string): boolean {\r\n const result = this.query()\r\n .delete(table)\r\n .where({ column: 'id', operator: '=', value: id })\r\n .execute()\r\n\r\n return true\r\n }\r\n\r\n // ════════ Transactions ════════\r\n transaction(callback: (db: DB) => void): void {\r\n this.db.exec('BEGIN TRANSACTION')\r\n try {\r\n callback(this)\r\n this.db.exec('COMMIT')\r\n } catch (error) {\r\n this.db.exec('ROLLBACK')\r\n throw error\r\n }\r\n }\r\n\r\n // ════════ Raw SQL ════════\r\n exec(sql: string): void {\r\n this.db.exec(sql)\r\n }\r\n\r\n raw(sql: string, params: SqlValue[] = []): any[] {\r\n const stmt = this.db.query(sql)\r\n return stmt.all(...params) as any[]\r\n }\r\n\r\n rawOne(sql: string, params: SqlValue[] = []): any | null {\r\n const stmt = this.db.query(sql)\r\n return stmt.get(...params) as any | null\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private reset(): void {\r\n this.currentQuery = ''\r\n this.currentParams = []\r\n }\r\n\r\n private createQueryBuilder(): QueryBuilder {\r\n const builder: any = {\r\n _select: ['*'],\r\n _from: '',\r\n _where: [] as string[],\r\n _orderBy: '',\r\n _limit: null as number | null,\r\n _offset: null as number | null,\r\n _isInsert: false,\r\n _isUpdate: false,\r\n _isDelete: false,\r\n _insertData: null as Record<string, SqlValue> | null,\r\n _updateData: null as Record<string, SqlValue> | null\r\n }\r\n\r\n const self = this\r\n\r\n builder.select = function(columns?: string[]) {\r\n this._select = columns || ['*']\r\n return this\r\n }\r\n\r\n builder.from = function(table: string) {\r\n this._from = table\r\n return this\r\n }\r\n\r\n builder.where = function(condition: WhereCondition | WhereCondition[]) {\r\n const conditions = Array.isArray(condition) ? condition : [condition]\r\n\r\n const whereClauses = conditions.map(cond => {\r\n if (cond.operator === 'IS NULL' || cond.operator === 'IS NOT NULL') {\r\n return `${cond.column} ${cond.operator}`\r\n } else if (cond.operator === 'IN' && Array.isArray(cond.value)) {\r\n const placeholders = cond.value.map(() => '?').join(', ')\r\n // Spread array values into params\r\n cond.value.forEach(val => {\r\n self.currentParams.push(val as SqlValue)\r\n })\r\n return `${cond.column} IN (${placeholders})`\r\n } else {\r\n self.currentParams.push(cond.value as SqlValue)\r\n return `${cond.column} ${cond.operator} ?`\r\n }\r\n })\r\n\r\n this._where.push(...whereClauses)\r\n return this\r\n }\r\n\r\n builder.and = function(condition: WhereCondition) {\r\n return this.where(condition)\r\n }\r\n\r\n builder.or = function(condition: WhereCondition) {\r\n if (condition.operator === 'IS NULL' || condition.operator === 'IS NOT NULL') {\r\n this._where.push(`OR ${condition.column} ${condition.operator}`)\r\n } else if (condition.operator === 'IN' && Array.isArray(condition.value)) {\r\n const placeholders = condition.value.map(() => '?').join(', ')\r\n // Spread array values into params\r\n condition.value.forEach(val => {\r\n self.currentParams.push(val as SqlValue)\r\n })\r\n this._where.push(`OR ${condition.column} IN (${placeholders})`)\r\n } else {\r\n self.currentParams.push(condition.value as SqlValue)\r\n this._where.push(`OR ${condition.column} ${condition.operator} ?`)\r\n }\r\n return this\r\n }\r\n\r\n builder.orderBy = function(column: string, direction: 'ASC' | 'DESC' = 'ASC') {\r\n this._orderBy = `ORDER BY ${column} ${direction}`\r\n return this\r\n }\r\n\r\n builder.limit = function(count: number) {\r\n this._limit = count\r\n return this\r\n }\r\n\r\n builder.offset = function(count: number) {\r\n this._offset = count\r\n return this\r\n }\r\n\r\n builder.insert = function(table: string, data: Record<string, SqlValue>) {\r\n this._isInsert = true\r\n this._from = table\r\n this._insertData = data\r\n return this\r\n }\r\n\r\n builder.update = function(table: string, data: Record<string, SqlValue>) {\r\n this._isUpdate = true\r\n this._from = table\r\n this._updateData = data\r\n return this\r\n }\r\n\r\n builder.delete = function(table: string) {\r\n this._isDelete = true\r\n this._from = table\r\n return this\r\n }\r\n\r\n builder.raw = function(sql: string, params: SqlValue[] = []) {\r\n self.currentQuery = sql\r\n self.currentParams = params\r\n return this\r\n }\r\n\r\n builder.execute = function() {\r\n let sql = ''\r\n\r\n if (this._isInsert && this._insertData) {\r\n const columns = Object.keys(this._insertData)\r\n const placeholders = columns.map(() => '?').join(', ')\r\n sql = `INSERT INTO ${this._from} (${columns.join(', ')}) VALUES (${placeholders})`\r\n self.currentParams = Object.values(this._insertData)\r\n } else if (this._isUpdate && this._updateData) {\r\n const setClauses = Object.keys(this._updateData).map(col => `${col} = ?`)\r\n const updateValues = Object.values(this._updateData)\r\n self.currentParams = [...updateValues, ...self.currentParams] as SqlValue[]\r\n sql = `UPDATE ${this._from} SET ${setClauses.join(', ')}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n } else if (this._isDelete) {\r\n sql = `DELETE FROM ${this._from}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n } else {\r\n // SELECT query\r\n sql = `SELECT ${this._select.join(', ')} FROM ${this._from}`\r\n\r\n if (this._where.length > 0) {\r\n sql += ` WHERE ${this._where.join(' AND ')}`\r\n }\r\n\r\n if (this._orderBy) {\r\n sql += ` ${this._orderBy}`\r\n }\r\n\r\n if (this._limit !== null) {\r\n sql += ` LIMIT ${this._limit}`\r\n }\r\n\r\n if (this._offset !== null) {\r\n sql += ` OFFSET ${this._offset}`\r\n }\r\n }\r\n\r\n if (!sql && self.currentQuery) {\r\n sql = self.currentQuery\r\n }\r\n\r\n const stmt = self.db.query(sql)\r\n const result = stmt.all(...self.currentParams) as unknown[]\r\n self.reset()\r\n return result as any[]\r\n }\r\n\r\n builder.executeOne = function() {\r\n const results = this.execute()\r\n return results.length > 0 ? results[0] : null\r\n }\r\n\r\n builder.executeRaw = function(sql: string, params: SqlValue[] = []) {\r\n const stmt = self.db.query(sql)\r\n const result = stmt.all(...params) as unknown[]\r\n return result as any[]\r\n }\r\n\r\n return builder as QueryBuilder\r\n }\r\n\r\n private generateCreateTableSQL(schema: TableSchema): string {\r\n const columnDefs = schema.columns.map(col => {\r\n let def = `${col.name} ${col.type}`\r\n\r\n if (col.primaryKey) {\r\n def += ' PRIMARY KEY'\r\n if (col.autoIncrement) {\r\n def += ' AUTOINCREMENT'\r\n }\r\n }\r\n\r\n if (col.notNull && !col.primaryKey) {\r\n def += ' NOT NULL'\r\n }\r\n\r\n if (col.unique) {\r\n def += ' UNIQUE'\r\n }\r\n\r\n if (col.default !== undefined) {\r\n if (typeof col.default === 'string') {\r\n def += ` DEFAULT '${col.default}'`\r\n } else if (col.default === null) {\r\n def += ' DEFAULT NULL'\r\n } else {\r\n def += ` DEFAULT ${col.default}`\r\n }\r\n }\r\n\r\n if (col.references) {\r\n def += ` REFERENCES ${col.references.table}(${col.references.column})`\r\n }\r\n\r\n return def\r\n })\r\n\r\n return `CREATE TABLE IF NOT EXISTS ${schema.name} (${columnDefs.join(', ')})`\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n // ════════ Schema Builder Helpers ════════\r\n export function table(name: string, columns: ColumnDefinition[]): TableSchema {\r\n return { name, columns }\r\n }\r\n\r\n export function column(name: string, type: ColumnType): ColumnDefinition {\r\n return { name, type }\r\n }\r\n\r\n export function integer(name: string): ColumnDefinition {\r\n return { name, type: 'INTEGER' }\r\n }\r\n\r\n export function text(name: string): ColumnDefinition {\r\n return { name, type: 'TEXT' }\r\n }\r\n\r\n export function real(name: string): ColumnDefinition {\r\n return { name, type: 'REAL' }\r\n }\r\n\r\n export function blob(name: string): ColumnDefinition {\r\n return { name, type: 'BLOB' }\r\n }\r\n\r\n export function numeric(name: string): ColumnDefinition {\r\n return { name, type: 'NUMERIC' }\r\n }\r\n\r\n // ════════ Column Modifiers ════════\r\n export function primaryKey(col: ColumnDefinition, autoIncrement = false): ColumnDefinition {\r\n return { ...col, primaryKey: true, autoIncrement }\r\n }\r\n\r\n export function notNull(col: ColumnDefinition): ColumnDefinition {\r\n return { ...col, notNull: true }\r\n }\r\n\r\n export function unique(col: ColumnDefinition): ColumnDefinition {\r\n return { ...col, unique: true }\r\n }\r\n\r\n export function defaultValue(col: ColumnDefinition, value: SqlValue): ColumnDefinition {\r\n return { ...col, default: value }\r\n }\r\n\r\n export function references(col: ColumnDefinition, table: string, column: string): ColumnDefinition {\r\n return { ...col, references: { table, column } }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/router.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n\texport interface RegexRoute {\r\n\t\tpattern\t\t: RegExp\r\n\t\tmethod\t\t: string\r\n\t\thandler\t\t: any\r\n\t\tkey\t\t\t: string\r\n\t}\r\n\r\n\texport type RegexRoutes = Array<RegexRoute>\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Router {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate routes \t\t\t= new Map<string, any>()\r\n\t\t\tprivate regexRoutes\t\t: RegexRoutes = []\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\tmatch(method: string, path: string): { handler: any; params: Record<string, string> } | null {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\t// Try static route first (faster)\r\n\t\t\t\tif (this.routes.has(key)) {\r\n\t\t\t\treturn { handler: this.routes.get(key), params: {} }\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Try dynamic routes\r\n\t\t\t\tfor (const route of this.regexRoutes) {\r\n\t\t\t\tif (route.method === method) {\r\n\t\t\t\t\tconst match = path.match(route.pattern)\r\n\t\t\t\t\tif (match?.groups) {\r\n\t\t\t\t\treturn { handler: route.handler, params: match.groups }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\tgetAll() {\r\n\t\t\t\tconst staticRoutes = Array.from(this.routes.entries()).map(([key, handler]) => {\r\n\t\t\t\tconst colonIndex = key.indexOf(':')\r\n\t\t\t\tconst method = key.substring(0, colonIndex)\r\n\t\t\t\tconst path = key.substring(colonIndex + 1)\r\n\t\t\t\treturn { method, path, handler }\r\n\t\t\t\t})\r\n\r\n\t\t\t\tconst dynamicRoutes = this.regexRoutes.map(route => {\r\n\t\t\t\tconst colonIndex = route.key.indexOf(':')\r\n\t\t\t\treturn {\r\n\t\t\t\t\tmethod: route.method,\r\n\t\t\t\t\tpath: route.key.substring(colonIndex + 1),\r\n\t\t\t\t\thandler: route.handler\r\n\t\t\t\t}\r\n\t\t\t\t})\r\n\r\n\t\t\t\treturn [...staticRoutes, ...dynamicRoutes]\r\n\t\t\t}\r\n\r\n\t\t\tclear() {\r\n\t\t\t\tthis.routes.clear()\r\n\t\t\t\tthis.regexRoutes = []\r\n\t\t\t}\r\n\r\n\t\t\tremove(method: string, path: string): boolean {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\tif (this.routes.has(key)) {\r\n\t\t\t\tthis.routes.delete(key)\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst index = this.regexRoutes.findIndex(r => r.key === key)\r\n\t\t\t\tif (index >= 0) {\r\n\t\t\t\tthis.regexRoutes.splice(index, 1)\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\tregister(method: string, path: string, handler: any, config: any = {}) {\r\n\t\t\t\tconst key = `${method}:${path}`\r\n\r\n\t\t\t\tif (path.includes(':')) {\r\n\t\t\t\t// Dynamic route with params\r\n\t\t\t\tconst pattern = this.pathToRegex(path)\r\n\r\n\t\t\t\t// Check if route already exists to prevent duplicates\r\n\t\t\t\tconst existingIndex = this.regexRoutes.findIndex(r => r.key === key)\r\n\r\n\t\t\t\tconst route = {\r\n\t\t\t\t\tpattern,\r\n\t\t\t\t\tmethod,\r\n\t\t\t\t\thandler,\r\n\t\t\t\t\tkey\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (existingIndex >= 0) {\r\n\t\t\t\t\t// Update existing route\r\n\t\t\t\t\tthis.regexRoutes[existingIndex] = route\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Add new route\r\n\t\t\t\t\tthis.regexRoutes.push(route)\r\n\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t// Static route\r\n\t\t\t\tthis.routes.set(key, handler)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n\t\t\tprivate pathToRegex(path: string): RegExp {\r\n\t\t\t\t// Escape special regex characters except ':'\r\n\t\t\t\tconst escaped = path.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n\t\t\t\t// Replace :param with named capture groups\r\n\t\t\t\tconst pattern = escaped.replace(/:(\\w+)/g, '(?<$1>[^/]+)')\r\n\t\t\t\treturn new RegExp(`^${pattern}$`)\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/security.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import crypto from 'crypto'\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class SecurityManager {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate rateLimitStore \t= new Map<string, { count: number; reset: number }>()\r\n\t\t\tprivate csrfTokens \t\t= new Map<string, { sessionId: string; expires: number }>()\r\n\t\t\tprivate requestLog\t\t= new Map<string, any>()\r\n\r\n\t\t\tprivate readonly MAX_REQUEST_LOG_SIZE = 1000\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\t// Rate Limiting with proper overflow handling\r\n\t\t\tcheckRateLimit(key: string, max: number, windowMs: number): boolean {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tconst record = this.rateLimitStore.get(key)\r\n\r\n\t\t\tif (record) {\r\n\t\t\t\tif (now < record.reset) {\r\n\t\t\t\t// Within the current window\r\n\t\t\t\tif (record.count >= max) {\r\n\t\t\t\t\treturn false // Rate limit exceeded\r\n\t\t\t\t}\r\n\t\t\t\trecord.count++\r\n\t\t\t\treturn true\r\n\t\t\t\t} else {\r\n\t\t\t\t// Window expired, reset\r\n\t\t\t\tthis.rateLimitStore.set(key, { count: 1, reset: now + windowMs })\r\n\t\t\t\treturn true\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// First request for this key\r\n\t\t\t\tthis.rateLimitStore.set(key, { count: 1, reset: now + windowMs })\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Cleanup old rate limit records\r\n\t\t\tcleanupRateLimit() {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tfor (const [key, record] of this.rateLimitStore.entries()) {\r\n\t\t\t\tif (now > record.reset) {\r\n\t\t\t\tthis.rateLimitStore.delete(key)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// CSRF Token Generation with TTL\r\n\t\t\tgenerateCsrfToken(sessionId: string, ttl = 3600000): string {\r\n\t\t\tconst token = crypto.randomBytes(32).toString('hex')\r\n\t\t\tthis.csrfTokens.set(token, {\r\n\t\t\t\tsessionId,\r\n\t\t\t\texpires: Date.now() + ttl\r\n\t\t\t})\r\n\t\t\treturn token\r\n\t\t\t}\r\n\r\n\t\t\t// Validate CSRF Token with expiration check\r\n\t\t\tvalidateCsrfToken(token: string, sessionId: string): boolean {\r\n\t\t\tconst stored = this.csrfTokens.get(token)\r\n\r\n\t\t\tif (!stored) {\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Check if token has expired\r\n\t\t\tif (Date.now() > stored.expires) {\r\n\t\t\t\tthis.csrfTokens.delete(token)\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Validate session ID\r\n\t\t\tif (stored.sessionId === sessionId) {\r\n\t\t\t\tthis.csrfTokens.delete(token) // One-time use\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\r\n\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\t// Cleanup expired CSRF tokens\r\n\t\t\tcleanupCsrfTokens() {\r\n\t\t\tconst now = Date.now()\r\n\t\t\tfor (const [token, data] of this.csrfTokens.entries()) {\r\n\t\t\t\tif (now > data.expires) {\r\n\t\t\t\tthis.csrfTokens.delete(token)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// HTML Sanitization - comprehensive\r\n\t\t\tsanitizeHtml(html: string): string {\r\n\t\t\tif (!html) return ''\r\n\r\n\t\t\treturn html\r\n\t\t\t\t.replace(/&/g, '&amp;')\r\n\t\t\t\t.replace(/</g, '&lt;')\r\n\t\t\t\t.replace(/>/g, '&gt;')\r\n\t\t\t\t.replace(/\"/g, '&quot;')\r\n\t\t\t\t.replace(/'/g, '&#x27;')\r\n\t\t\t\t.replace(/\\//g, '&#x2F;')\r\n\t\t\t}\r\n\r\n\t\t\t// SQL Injection Prevention\r\n\t\t\tsanitizeSql(input: string): string {\r\n\t\t\tif (!input) return ''\r\n\r\n\t\t\treturn input\r\n\t\t\t\t.replace(/\\\\/g, '\\\\\\\\') // Escape backslashes first\r\n\t\t\t\t.replace(/;/g, '') // Remove semicolons to prevent multi-statement injection\r\n\t\t\t\t.replace(/'/g, \"''\") // Escape single quotes (SQL standard)\r\n\t\t\t\t.replace(/\"/g, '\\\\\"') // Escape double quotes\r\n\t\t\t\t.replace(/\\x00/g, '') // Remove null bytes\r\n\t\t\t}\r\n\r\n\t\t\t// Log request for audit trail with size limit\r\n\t\t\tlogRequest(\r\n\t\t\tid: string,\r\n\t\t\tmethod: string,\r\n\t\t\tpath: string,\r\n\t\t\tip: string,\r\n\t\t\tstatus: number,\r\n\t\t\tduration: number\r\n\t\t\t) {\r\n\t\t\tthis.requestLog.set(id, {\r\n\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\tmethod,\r\n\t\t\t\tpath,\r\n\t\t\t\tip,\r\n\t\t\t\tstatus,\r\n\t\t\t\tduration\r\n\t\t\t})\r\n\r\n\t\t\t// Keep only last MAX_REQUEST_LOG_SIZE requests\r\n\t\t\tif (this.requestLog.size > this.MAX_REQUEST_LOG_SIZE) {\r\n\t\t\t\tconst { value: first } = this.requestLog.keys().next() || { value: null }\r\n\t\t\t\tif (first) {\r\n\t\t\t\tthis.requestLog.delete(first)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Get request log by ID\r\n\t\t\tgetRequestLog(id: string) {\r\n\t\t\treturn this.requestLog.get(id)\r\n\t\t\t}\r\n\r\n\t\t\t// Get all request logs\r\n\t\t\tgetAllRequestLogs() {\r\n\t\t\treturn Array.from(this.requestLog.values())\r\n\t\t\t}\r\n\r\n\t\t\t// Clear all\r\n\t\t\tclearAll() {\r\n\t\t\tthis.rateLimitStore.clear()\r\n\t\t\tthis.csrfTokens.clear()\r\n\t\t\tthis.requestLog.clear()\r\n\t\t\t}\r\n\r\n\t\t\t// Get stats\r\n\t\t\tgetStats() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\trateLimitEntries: this.rateLimitStore.size,\r\n\t\t\t\t\tcsrfTokens: this.csrfTokens.size,\r\n\t\t\t\t\trequestLogs: this.requestLog.size\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/logger.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n\texport class Logger {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n\t\t\tprivate level\t: number \t= 1\r\n\t\t\tprivate pretty\t: boolean \t= false\r\n\t\t\tprivate levels\t\t\t\t= { debug: 0, info: 1, warn: 2, error: 3, fatal: 4 }\r\n\r\n\t\t\t// ANSI color codes\r\n\t\t\tprivate colors = {\r\n\t\t\t\treset\t: '\\x1b[0m',\r\n\t\t\t\tgray\t: '\\x1b[90m',\r\n\t\t\t\tcyan\t: '\\x1b[36m',\r\n\t\t\t\tgreen\t: '\\x1b[32m',\r\n\t\t\t\tyellow\t: '\\x1b[33m',\r\n\t\t\t\tred\t\t: '\\x1b[31m',\r\n\t\t\t\tmagenta\t: '\\x1b[35m',\r\n\t\t\t\tbold\t: '\\x1b[1m'\r\n\t\t\t}\r\n\r\n\t\t\tconstructor(level: 'debug' | 'info' | 'warn' | 'error' = 'info', pretty = false) {\r\n\t\t\t\tthis.level \t= this.levels[level] ?? 1\r\n\t\t\t\tthis.pretty = pretty\r\n\t\t\t}\r\n\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n\t\t\tdebug(data: any, msg?: string) {\r\n\t\t\t\tthis.log('debug', this.levels.debug, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\tinfo(data: any, msg?: string) {\r\n\t\t\t\tthis.log('info', this.levels.info, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\twarn(data: any, msg?: string) {\r\n\t\t\t\tthis.log('warn', this.levels.warn, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\terror(data: any, msg?: string) {\r\n\t\t\t\tthis.log('error', this.levels.error, data, msg)\r\n\t\t\t}\r\n\r\n\t\t\tfatal(data: any, msg?: string) {\r\n\t\t\t\tthis.log('fatal', this.levels.fatal, data, msg)\r\n\t\t\t\tif (process.env.NODE_ENV === 'production') {\r\n\t\t\t\t\t// Could send to external logging service here\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n\t\t\tprivate log(level: string, levelNum: number, data: any, msg?: string) {\r\n\t\t\t\tif (levelNum < this.level) return\r\n\r\n\t\t\t\tconst safeData = data ?? {}\r\n\r\n\t\t\t\tif (this.pretty) {\r\n\t\t\t\t\tthis.prettyLog(level, safeData, msg)\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// JSON format (unchanged for compatibility)\r\n\t\t\t\t\tconst ts = new Date().toISOString()\r\n\t\t\t\t\tconst output = {\r\n\t\t\t\t\t\ttimestamp\t: ts,\r\n\t\t\t\t\t\tlevel\t\t: level.toUpperCase(),\r\n\t\t\t\t\t\tmessage\t\t: msg || 'No message',\r\n\t\t\t\t\t\t...safeData\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst str = JSON.stringify(output)\r\n\r\n\t\t\t\t\tif (level === 'error' || level === 'fatal') {\r\n\t\t\t\t\t\tconsole.error(str)\r\n\t\t\t\t\t} else if (level === 'warn') {\r\n\t\t\t\t\t\tconsole.warn(str)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tconsole.log(str)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tprivate prettyLog(level: string, data: any, msg?: string) {\r\n\t\t\t\tconst c = this.colors\r\n\t\t\t\tconst time = new Date().toLocaleTimeString('en-US', { hour12: false })\r\n\r\n\t\t\t\t// Special handling for request logs (Morgan-style)\r\n\t\t\t\tif (data.method && data.path && data.status !== undefined) {\r\n\t\t\t\t\tconst method = this.colorizeMethod(data.method)\r\n\t\t\t\t\tconst status = this.colorizeStatus(data.status)\r\n\t\t\t\t\tconst duration = data.duration ? `${data.duration}ms` : ''\r\n\t\t\t\t\tconst path = data.path\r\n\r\n\t\t\t\t\tconsole.log(\r\n\t\t\t\t\t\t`${c.gray}${time}${c.reset} ` +\r\n\t\t\t\t\t\t`${method} ` +\r\n\t\t\t\t\t\t`${c.bold}${path}${c.reset} ` +\r\n\t\t\t\t\t\t`${status} ` +\r\n\t\t\t\t\t\t`${c.gray}${duration}${c.reset}`\r\n\t\t\t\t\t)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Special handling for route registration\r\n\t\t\t\tif (msg === 'Route added' && data.method && data.path) {\r\n\t\t\t\t\tconst methods = Array.isArray(data.method) ? data.method.join('|') : data.method\r\n\t\t\t\t\tconsole.log(\r\n\t\t\t\t\t\t`${c.gray}${time}${c.reset} ` +\r\n\t\t\t\t\t\t`${c.cyan}→${c.reset} ` +\r\n\t\t\t\t\t\t`${c.bold}${methods.padEnd(6)}${c.reset} ` +\r\n\t\t\t\t\t\t`${data.path}`\r\n\t\t\t\t\t)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Special handling for database connection\r\n\t\t\t\tif (msg === '✔ Database connected') {\r\n\t\t\t\t\tconsole.log(\r\n\t\t\t\t\t\t`${c.gray}${time}${c.reset} ` +\r\n\t\t\t\t\t\t`${c.green}✓${c.reset} ` +\r\n\t\t\t\t\t\t`Database connected ${c.gray}(${data.name})${c.reset}`\r\n\t\t\t\t\t)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Special handling for server start\r\n\t\t\t\tif (msg === 'Server started') {\r\n\t\t\t\t\tconsole.log(\r\n\t\t\t\t\t\t`${c.gray}${time}${c.reset} ` +\r\n\t\t\t\t\t\t`${c.green}✓${c.reset} ` +\r\n\t\t\t\t\t\t`Server started at ${c.cyan}${data.url}${c.reset}`\r\n\t\t\t\t\t)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Generic colored output\r\n\t\t\t\tconst icon = this.getLevelIcon(level)\r\n\t\t\t\tconst color = this.getLevelColor(level)\r\n\r\n\t\t\t\tlet output = `${c.gray}${time}${c.reset} ${color}${icon}${c.reset} `\r\n\r\n\t\t\t\tif (msg) {\r\n\t\t\t\t\toutput += `${msg} `\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Add key data points inline\r\n\t\t\t\tconst keys = Object.keys(data).filter(k =>\r\n\t\t\t\t\t!['timestamp', 'level', 'message'].includes(k)\r\n\t\t\t\t)\r\n\r\n\t\t\t\tif (keys.length > 0) {\r\n\t\t\t\t\tconst parts = keys.map(k => {\r\n\t\t\t\t\t\tconst val = data[k]\r\n\t\t\t\t\t\tif (typeof val === 'string' || typeof val === 'number') {\r\n\t\t\t\t\t\t\treturn `${c.gray}${k}:${c.reset}${val}`\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn null\r\n\t\t\t\t\t}).filter(Boolean)\r\n\r\n\t\t\t\t\tif (parts.length > 0) {\r\n\t\t\t\t\t\toutput += c.gray + parts.join(' ') + c.reset\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconsole.log(output)\r\n\t\t\t}\r\n\r\n\t\t\tprivate colorizeMethod(method: string): string {\r\n\t\t\t\tconst c = this.colors\r\n\t\t\t\tconst m = method.toUpperCase()\r\n\r\n\t\t\t\tswitch (m) {\r\n\t\t\t\t\tcase 'GET':\t\treturn `${c.green}${m}${c.reset}`\r\n\t\t\t\t\tcase 'POST':\treturn `${c.cyan}${m}${c.reset}`\r\n\t\t\t\t\tcase 'PUT':\t\treturn `${c.yellow}${m}${c.reset}`\r\n\t\t\t\t\tcase 'DELETE':\treturn `${c.red}${m}${c.reset}`\r\n\t\t\t\t\tcase 'PATCH':\treturn `${c.magenta}${m}${c.reset}`\r\n\t\t\t\t\tdefault:\t\treturn `${c.gray}${m}${c.reset}`\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tprivate colorizeStatus(status: number | undefined): string {\r\n\t\t\t\tif (!status) return ''\r\n\r\n\t\t\t\tconst c = this.colors\r\n\t\t\t\tconst s = status.toString()\r\n\r\n\t\t\t\tif (status >= 200 && status < 300) {\r\n\t\t\t\t\treturn `${c.green}${s}${c.reset}`\r\n\t\t\t\t} else if (status >= 300 && status < 400) {\r\n\t\t\t\t\treturn `${c.cyan}${s}${c.reset}`\r\n\t\t\t\t} else if (status >= 400 && status < 500) {\r\n\t\t\t\t\treturn `${c.yellow}${s}${c.reset}`\r\n\t\t\t\t} else if (status >= 500) {\r\n\t\t\t\t\treturn `${c.red}${s}${c.reset}`\r\n\t\t\t\t}\r\n\t\t\t\treturn `${c.gray}${s}${c.reset}`\r\n\t\t\t}\r\n\r\n\t\t\tprivate getLevelIcon(level: string): string {\r\n\t\t\t\tswitch (level) {\r\n\t\t\t\t\tcase 'debug':\treturn '◆'\r\n\t\t\t\t\tcase 'info':\treturn '→'\r\n\t\t\t\t\tcase 'warn':\treturn '⚠'\r\n\t\t\t\t\tcase 'error':\treturn '✖'\r\n\t\t\t\t\tcase 'fatal':\treturn '☠'\r\n\t\t\t\t\tdefault:\t\treturn '•'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tprivate getLevelColor(level: string): string {\r\n\t\t\t\tconst c = this.colors\r\n\t\t\t\tswitch (level) {\r\n\t\t\t\t\tcase 'debug':\treturn c.gray\r\n\t\t\t\t\tcase 'info':\treturn c.cyan\r\n\t\t\t\t\tcase 'warn':\treturn c.yellow\r\n\t\t\t\t\tcase 'error':\treturn c.red\r\n\t\t\t\t\tcase 'fatal':\treturn c.red + c.bold\r\n\t\t\t\t\tdefault:\t\treturn c.reset\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\t}\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/types.d.ts\r\n//\r\n// Developed with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD'\r\n export type RouteHandler = (c: AppContext) => any | Promise<any>\r\n export type AppMiddleware = (c: AppContext, next: () => Promise<void>) => void | Promise<void>\r\n\r\n export interface AppContext {\r\n ip : string\r\n request : Request\r\n params : Record<string, string>\r\n query : Record<string, any>\r\n body : any\r\n headers : Headers\r\n db : any\r\n logger : Logger | null\r\n user? : any\r\n requestId : string\r\n\r\n // Response methods\r\n json (data: any, status?: number): Response\r\n text (data: string, status?: number): Response\r\n html (data: string, status?: number): Response\r\n redirect (url: string, status?: number): Response\r\n file (path: string, contentType?: string): Response\r\n\r\n // Cookie methods\r\n setCookie (name: string, value: string, options?: CookieOptions): AppContext\r\n getCookie (name: string): string | undefined\r\n deleteCookie (name: string, options?: Partial<CookieOptions>): AppContext\r\n\r\n // Header methods\r\n setHeader(key: string, value: string): AppContext\r\n getHeader(key: string): string | undefined\r\n\r\n // Status code\r\n status(code: number): AppContext\r\n statusCode: number\r\n }\r\n\r\n export interface CookieOptions {\r\n maxAge? : number\r\n expires? : Date\r\n path? : string\r\n domain? : string\r\n secure? : boolean\r\n httpOnly? : boolean\r\n sameSite? : 'Strict' | 'Lax' | 'None'\r\n }\r\n\r\n export interface RouteDefinition {\r\n method : HttpMethod | HttpMethod[]\r\n path : string\r\n handler : RouteHandler\r\n validate? : { body?: any, query?: any, params?: any }\r\n middlewares? : AppMiddleware[]\r\n timeout? : number\r\n rateLimit? : { max: number; windowMs: number }\r\n cache? : number\r\n tags? : string[]\r\n }\r\n\r\n export interface DatabaseConfig {\r\n name? : string\r\n connection : string // File path or ':memory:'\r\n schema? : Record<string, any>\r\n timeout? : number\r\n }\r\n\r\n export interface SecurityConfig {\r\n cors? : boolean | CorsConfig\r\n rateLimit? : boolean | RateLimitConfig\r\n csrf? : boolean | CsrfConfig\r\n helmet? : boolean | HelmetConfig\r\n auth? : boolean | AuthConfig\r\n validation? : boolean\r\n sanitize? : boolean\r\n }\r\n\r\n export interface CorsConfig {\r\n origin? : string | string[] | ((origin: string) => boolean)\r\n methods? : HttpMethod[]\r\n allowedHeaders? : string[]\r\n credentials? : boolean\r\n maxAge? : number\r\n }\r\n\r\n export interface RateLimitConfig {\r\n windowMs? : number\r\n max? : number\r\n keyGenerator? : (c: AppContext) => string\r\n message? : string\r\n }\r\n\r\n export interface CsrfConfig {\r\n secret? : string\r\n headerName? : string\r\n tokenTTL? : number\r\n }\r\n\r\n export interface HelmetConfig {\r\n contentSecurityPolicy? : Record<string, string[]> | boolean\r\n hsts? : boolean | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean }\r\n frameguard? : boolean | { action: 'deny' | 'sameorigin' }\r\n noSniff? : boolean\r\n xssFilter? : boolean\r\n referrerPolicy? : string | boolean\r\n }\r\n\r\n export interface AuthConfig {\r\n jwt? : boolean | { secret: string; expiresIn?: string }\r\n apiKey? : boolean | { header?: string }\r\n bearer? : boolean\r\n }\r\n\r\n export interface ServerConfig {\r\n port? : number | string\r\n hostname? : string\r\n requestTimeout? : number\r\n maxRequestSize? : number\r\n maxJsonSize? : number\r\n\r\n database? : DatabaseConfig | DatabaseConfig[]\r\n\r\n security? : boolean | SecurityConfig\r\n\r\n compression? : boolean | { threshold?: number }\r\n\r\n logging? : boolean | { level?: 'debug' | 'info' | 'warn' | 'error'; pretty?: boolean }\r\n\r\n routes? : RouteDefinition[]\r\n middlewares? : AppMiddleware[]\r\n\r\n errorHandler? : (error: Error, context: AppContext) => void | Promise<void>\r\n onShutdown? : () => void | Promise<void>\r\n\r\n apiPrefix? : string\r\n apiVersion? : string\r\n\r\n gracefulShutdownTimeout?: number\r\n }\r\n\r\n export interface ServerInstance {\r\n app : any\r\n logger : Logger | null\r\n db : Map<string, any>\r\n bunServer : any\r\n start : () => Promise<void>\r\n stop : () => Promise<void>\r\n addRoute : (route: RouteDefinition) => void\r\n addRoutes : (routes: RouteDefinition[]) => void\r\n getRoutes : () => RouteDefinition[]\r\n }\r\n\r\n export interface Logger {\r\n debug (data: any, msg?: string): void\r\n info (data: any, msg?: string): void\r\n warn (data: any, msg?: string): void\r\n error (data: any, msg?: string): void\r\n fatal (data: any, msg?: string): void\r\n }\r\n\r\n export class AppError extends Error {\r\n constructor(public message: string, public statusCode: number = 500, public code?: string) {\r\n super(message)\r\n this.name = 'AppError'\r\n }\r\n }\r\n\r\n export class ValidationError extends AppError {\r\n constructor(message: string, public issues?: any) {\r\n super(message, 400, 'VALIDATION_ERROR')\r\n this.name = 'ValidationError'\r\n }\r\n }\r\n\r\n export class DatabaseError extends AppError {\r\n constructor(message: string) {\r\n super(message, 500, 'DATABASE_ERROR')\r\n this.name = 'DatabaseError'\r\n }\r\n }\r\n\r\n export class TimeoutError extends AppError {\r\n constructor(message = 'Request timeout') {\r\n super(message, 408, 'TIMEOUT_ERROR')\r\n this.name = 'TimeoutError'\r\n }\r\n }\r\n\r\n export class RateLimitError extends AppError {\r\n constructor(message = 'Too many requests') {\r\n super(message, 429, 'RATE_LIMIT_ERROR')\r\n this.name = 'RateLimitError'\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/main.ts\n//\n// Developed with ❤️ by Maysara.\n\n\n\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\n\n import { DB } from './mod/db'\n import { Router } from './mod/router'\n import { SecurityManager } from './mod/security'\n import { Logger } \tfrom './mod/logger'\n import * as types from './types.d'\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\n\n const security = new SecurityManager()\n const router = new Router()\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\n\n export function server(config: types.ServerConfig = {}): types.ServerInstance {\n\n\t\t// ════════ Configuration ════════\n\t\tconst port = Number(config.port) || 3000\n\t\tconst hostname = config.hostname || 'localhost'\n\t\tconst maxReqSize = config.maxRequestSize || 10 * 1024 * 1024\n\t\tconst requestTimeout = config.requestTimeout || 30000\n\t\tconst gracefulShutdownTimeout = config.gracefulShutdownTimeout || 10000\n\n\t\tconst logCfg = typeof config.logging === 'object' ? config.logging : {}\n\t\tconst logger = config.logging ? new Logger(logCfg.level || 'info', logCfg.pretty) : null\n\n\t\tconst dbs = new Map<string, any>()\n\t\tconst routes: types.RouteDefinition[] = []\n\t\tconst activeRequests = new Set<string>()\n\n\t\t// ════════ Cleanup intervals ════════\n const cleanupInterval = setInterval(() => {\n security.cleanupRateLimit()\n security.cleanupCsrfTokens()\n }, 2 * 60 * 1000)\n\n async function handleRequest(request: Request): Promise<Response> {\n const startTime = Date.now()\n const requestId = crypto.randomUUID()\n const url = new URL(request.url)\n const path = url.pathname\n const method = request.method.toUpperCase()\n const ip = getClientIp(request)\n\n activeRequests.add(requestId)\n\n try {\n // Check request size from header\n const contentLength = request.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > maxReqSize) {\n\n logger?.warn({ requestId, size: contentLength, ip }, 'Request too large')\n\n return new Response(JSON.stringify({ error: 'Payload too large' }), {\n\t\t\t\t\t\tstatus\t: 413,\n\t\t\t\t\t\theaders\t: { 'Content-Type': 'application/json' }\n })\n }\n\n // CORS handling\n const corsHeaders = handleCors(request, config)\n if (method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders })\n }\n\n // Rate limiting\n if (config.security && typeof config.security === 'object' && config.security.rateLimit) {\n const rateLimitCfg = typeof config.security.rateLimit === 'object'\n ? config.security.rateLimit\n : {}\n const max = rateLimitCfg.max || 100\n const windowMs = rateLimitCfg.windowMs || 60000\n const rateLimitKey = rateLimitCfg.keyGenerator\n ? rateLimitCfg.keyGenerator({ request, ip } as any)\n : ip\n\n if (!security.checkRateLimit(rateLimitKey, max, windowMs)) {\n logger?.warn({ requestId, ip, key: rateLimitKey }, 'Rate limit exceeded')\n return new Response(\n JSON.stringify({ error: rateLimitCfg.message || 'Too many requests' }),\n { status: 429, headers: { 'Content-Type': 'application/json' } }\n )\n }\n }\n\n // Parse body\n let body: any = null\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n body = await parseBody(request, logger, maxReqSize)\n }\n\n // Get database\n const defaultDb = dbs.get('default')\n\n // Match route\n const routeMatch = router.match(method, path)\n if (!routeMatch) {\n const ctx = createAppContext(ip, request, {}, defaultDb, logger, requestId)\n logger?.warn({ requestId, method, path, ip }, 'Route not found')\n return ctx.json({ error: 'Not Found', path }, 404)\n }\n\n const ctx = createAppContext(ip, request, routeMatch.params || {}, defaultDb, logger, requestId)\n ctx.body = body\n ctx.request = request\n\n // Execute route handler with timeout\n const controller = new AbortController()\n const timeoutPromise = new Promise<never>((_, reject) => {\n const id = setTimeout(() => {\n controller.abort()\n reject(new types.TimeoutError('Request timeout'))\n }, requestTimeout)\n controller.signal.addEventListener('abort', () => clearTimeout(id))\n })\n\n const response = await Promise.race([\n routeMatch.handler(ctx),\n timeoutPromise\n ]) as Response\n\n // Merge CORS and security headers\n const resHeaders = new Headers(response.headers)\n corsHeaders.forEach((value, key) => {\n if (!resHeaders.has(key)) resHeaders.set(key, value)\n })\n\n resHeaders.set('X-Request-ID', requestId)\n resHeaders.set('X-Content-Type-Options', 'nosniff')\n resHeaders.set('X-Frame-Options', 'DENY')\n resHeaders.set('X-XSS-Protection', '1; mode=block')\n resHeaders.set('Referrer-Policy', 'strict-origin-when-cross-origin')\n\n // Audit log\n const duration = Date.now() - startTime\n security.logRequest(requestId, method, path, ip, response.status, duration)\n logger?.info({\n requestId,\n method,\n path,\n status: response.status,\n duration,\n ip\n }, 'Request completed')\n\n return new Response(response.body, {\n status: response.status,\n headers: resHeaders\n })\n } catch (error) {\n if (error instanceof types.AppError) {\n logger?.warn({ error: error.message, requestId, ip }, `App error: ${error.message}`)\n return new Response(\n JSON.stringify({\n error\t: error.message,\n code\t: error.code,\n requestId\n }),\n { status: error.statusCode, headers: { 'Content-Type': 'application/json' } }\n )\n }\n\n logger?.error({ error: String(error), requestId, ip }, 'Unhandled error')\n\n const errorMessage = process.env.NODE_ENV === 'production'\n ? 'Internal Server Error'\n : (error as Error).message\n\n return new Response(\n JSON.stringify({ error: errorMessage, requestId }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n )\n } finally {\n activeRequests.delete(requestId)\n }\n }\n\n // ════════ Health & Readiness routes ════════\n const healthRoute: types.RouteDefinition = {\n method : 'GET',\n path : '/health',\n handler : (c: types.AppContext) => c.json({\n status : 'healthy',\n timestamp : new Date().toISOString(),\n uptime : process.uptime(),\n activeRequests : activeRequests.size\n })\n }\n\n const readinessRoute: types.RouteDefinition = {\n method : 'GET',\n path : '/readiness',\n handler : (c: types.AppContext) => {\n const dbConnected = dbs.size > 0\n const ready = dbConnected || dbs.size === 0\n return c.json({\n ready,\n checks : {\n database : dbConnected ? 'connected' : 'not configured',\n activeRequests : activeRequests.size\n },\n timestamp: new Date().toISOString()\n }, ready ? 200 : 503)\n }\n }\n\n // ════════ Register routes ════════\n if (config.routes) {\n config.routes.forEach(route => {\n routes.push(route)\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n methods.forEach(m => {\n router.register(m, route.path, route.handler, route)\n })\n })\n }\n\n routes.push(healthRoute, readinessRoute)\n router.register('GET', '/health', healthRoute.handler, healthRoute)\n router.register('GET', '/readiness', readinessRoute.handler, readinessRoute)\n\n let bunServer: any = null\n\n const instance: types.ServerInstance = {\n app : null,\n logger,\n db : dbs,\n bunServer : null,\n\n async start() {\n // Initialize databases with our custom DB solution\n if (config.database) {\n const dbConfigs = Array.isArray(config.database) ? config.database : [config.database]\n for (const dbCfg of dbConfigs) {\n const dbName = dbCfg.name || 'default'\n\n try {\n if (typeof dbCfg.connection === 'string') {\n // Create DB instance with connection string\n const db = new DB(dbCfg.connection)\n\n // Define schemas if provided\n if (dbCfg.schema && typeof dbCfg.schema === 'object') {\n for (const [tableName, tableSchema] of Object.entries(dbCfg.schema)) {\n if (tableSchema && typeof tableSchema === 'object') {\n db.defineSchema(tableSchema as any)\n }\n }\n }\n\n dbs.set(dbName, db)\n\n logger?.info({\n name: dbName,\n connection: dbCfg.connection\n }, '✔ Database connected')\n } else {\n throw new Error(`Database connection must be a string path (got ${typeof dbCfg.connection})`)\n }\n } catch (error) {\n logger?.error({\n error: String(error),\n name: dbName\n }, 'Failed to connect to database')\n throw error\n }\n }\n }\n\n bunServer = Bun.serve({ port, hostname, fetch: handleRequest })\n instance.bunServer = bunServer\n\n const url = `http://${hostname}:${port}`\n console.log(\n `→ URL: ${url}` + `\\n` +\n `→ Environment: ${(process.env.NODE_ENV || 'development')}` + `\\n` +\n `→ Routes: ${routes.length.toString()}` + `\\n` +\n `→ Database: ${(dbs.size > 0 ? '✔ Connected' : '❌ None')}` + `\\n` +\n `→ Security: ${(config.security ? '✔ ENABLED' : '❌ Disabled')}` + `\\n` +\n `\\n` +\n `🔍 Health: ${url}/health` + `\\n` +\n `🔍 Ready: ${url}/readiness`+ `\\n`\n )\n\n logger?.info({ url }, 'Server started')\n },\n\n async stop() {\n logger?.info('Stopping server...')\n\n // Wait for active requests to complete\n if (activeRequests.size > 0) {\n logger?.info({ count: activeRequests.size }, 'Waiting for active requests...')\n const deadline = Date.now() + gracefulShutdownTimeout\n\n while (activeRequests.size > 0 && Date.now() < deadline) {\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n if (activeRequests.size > 0) {\n logger?.warn({ count: activeRequests.size }, 'Force closing with active requests')\n }\n }\n\n clearInterval(cleanupInterval)\n\n if (config.onShutdown) {\n try {\n await config.onShutdown()\n } catch (e) {\n logger?.error({ error: String(e) }, 'Error in shutdown handler')\n }\n }\n\n // Close database connections\n for (const [name, db] of dbs.entries()) {\n try {\n if (db && typeof db.close === 'function') {\n db.close()\n }\n logger?.info({ name }, 'Database closed')\n } catch (e) {\n logger?.error({ error: String(e), name }, 'Error closing database')\n }\n }\n\n if (bunServer) {\n bunServer.stop()\n logger?.info('Bun server stopped')\n }\n\n logger?.info('Server stopped successfully')\n },\n\n addRoute(route: types.RouteDefinition) {\n routes.push(route)\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n methods.forEach(m => {\n router.register(m, route.path, route.handler, route)\n })\n logger?.info({ method: route.method, path: route.path }, 'Route added')\n },\n\n addRoutes(routes: types.RouteDefinition[]) {\n routes.forEach(route => this.addRoute(route))\n },\n\n getRoutes() {\n return routes\n }\n }\n\n return instance\n\t}\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\n\n // Better body parsing with size validation\n async function parseBody(\n request : Request,\n logger : Logger | null,\n maxSize : number\n ): Promise<any> {\n const contentType = request.headers.get('content-type') || ''\n\n try {\n if (contentType.includes('application/json')) {\n\t\t\t\tconst text = await request.text()\n\n\t\t\t\t// Validate size after reading\n\t\t\t\tif (text.length > maxSize) {\n\t\t\t\t\tthrow new types.ValidationError('Payload too large')\n\t\t\t\t}\n\n\t\t\t\tif (!text.trim()) return {}\n\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(text)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlogger?.warn({\n\t\t\t\t\t\terror\t\t: String(e),\n\t\t\t\t\t\tbodyPreview\t: text.substring(0, 100)\n\t\t\t\t\t}, 'Invalid JSON in request body')\n\n\t\t\t\t\tthrow new types.ValidationError('Invalid JSON in request body')\n\t\t\t\t}\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const text = await request.text()\n if (text.length > maxSize) {\n throw new types.ValidationError('Payload too large')\n }\n\n return Object.fromEntries(new URLSearchParams(text))\n }\n\n if (contentType.includes('multipart/form-data')) {\n // Note: FormData size can't be validated before parsing\n return await request.formData()\n }\n\n } catch (e) {\n if (e instanceof types.ValidationError) throw e\n logger?.error({ error: String(e) }, 'Error parsing request body')\n throw new types.ValidationError('Failed to parse request body')\n }\n\n return {}\n }\n\n // Better cookie parsing\n function parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = new Map<string, string>()\n\n if (!cookieHeader) return cookies\n\n const pairs = cookieHeader.split(';')\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.trim().split('=')\n if (key) {\n const value = valueParts.join('=') // Handle '=' in value\n cookies.set(key, value ? decodeURIComponent(value) : '')\n }\n }\n\n return cookies\n }\n\n // Create app context with request ID\n function createAppContext(\n ip : string,\n request : Request,\n params : Record<string, string>,\n db : any,\n logger : Logger | null,\n requestId : string\n ): types.AppContext {\n const url = new URL(request.url)\n const query = Object.fromEntries(url.searchParams)\n const headers = request.headers\n let statusCode = 200\n const cookieStore = new Map<string, string>()\n const parsedCookies = parseCookies(headers.get('cookie') || '')\n\n const ctx: any = {\n ip,\n request,\n params,\n query,\n headers,\n db,\n logger,\n requestId,\n get statusCode() { return statusCode },\n set statusCode(code: number) { statusCode = code },\n body: null,\n\n json(data: any, status?: number): Response {\n return new Response(JSON.stringify(data), {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'application/json',\n ...this._setCookieHeaders()\n }\n })\n },\n\n text(data: string, status?: number): Response {\n return new Response(data, {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'text/plain',\n ...this._setCookieHeaders()\n }\n })\n },\n\n html(data: string, status?: number): Response {\n return new Response(data, {\n status : status ?? statusCode,\n headers : {\n 'Content-Type': 'text/html; charset=utf-8',\n ...this._setCookieHeaders()\n }\n })\n },\n\n redirect(url: string, status = 302): Response {\n return new Response(null, {\n status,\n headers : {\n Location : url,\n ...this._setCookieHeaders()\n }\n })\n },\n\n file(path: string, contentType = 'application/octet-stream'): Response {\n const file = Bun.file(path)\n return new Response(file, {\n headers: {\n 'Content-Type': contentType,\n ...this._setCookieHeaders()\n }\n })\n },\n\n setCookie(name: string, value: string, options: types.CookieOptions = {}): types.AppContext {\n let cookie = `${name}=${encodeURIComponent(value)}`\n\n if (options.maxAge !== undefined) {\n cookie += `; Max-Age=${options.maxAge}`\n }\n if (options.expires) {\n cookie += `; Expires=${options.expires.toUTCString()}`\n }\n if (options.path) {\n cookie += `; Path=${options.path}`\n }\n if (options.domain) {\n cookie += `; Domain=${options.domain}`\n }\n if (options.secure) {\n cookie += '; Secure'\n }\n if (options.httpOnly) {\n cookie += '; HttpOnly'\n }\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite}`\n }\n\n cookieStore.set(name, cookie)\n return ctx\n },\n\n getCookie(name: string): string | undefined {\n return parsedCookies.get(name)\n },\n\n deleteCookie(name: string, options: Partial<types.CookieOptions> = {}): types.AppContext {\n return ctx.setCookie(name, '', {\n ...options,\n maxAge: 0,\n path: options.path || '/'\n })\n },\n\n setHeader(key: string, value: string): types.AppContext {\n headers.set(key, value)\n return ctx\n },\n\n getHeader(key: string): string | undefined {\n return headers.get(key) || undefined\n },\n\n status(code: number): types.AppContext {\n statusCode = code\n return ctx\n },\n\n _setCookieHeaders(): Record<string, string | string[]> {\n const h: any = {}\n if (cookieStore.size > 0) {\n h['Set-Cookie'] = Array.from(cookieStore.values())\n }\n return h\n }\n }\n\n return ctx\n }\n\n // Better IP extraction\n function getClientIp(request: Request): string {\n const forwarded = request.headers.get('x-forwarded-for')\n\n if (forwarded) {\n const ips = forwarded.split(',').map(ip => ip.trim())\n return ips[0] || 'unknown'\n }\n\n const realIp = request.headers.get('x-real-ip')\n if (realIp) return realIp\n return 'unknown'\n }\n\n // CORS helper with proper configuration\n function handleCors(request: Request, config: types.ServerConfig): Headers {\n const headers = new Headers()\n\n if (!config.security || typeof config.security !== 'object' || !config.security.cors) {\n return headers\n }\n\n const corsConfig = typeof config.security.cors === 'object' ? config.security.cors : {}\n const origin = request.headers.get('Origin')\n\n if (origin) {\n if (typeof corsConfig.origin === 'function') {\n if (corsConfig.origin(origin)) {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n } else if (Array.isArray(corsConfig.origin)) {\n if (corsConfig.origin.includes(origin)) {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n } else if (typeof corsConfig.origin === 'string') {\n headers.set('Access-Control-Allow-Origin', corsConfig.origin)\n } else {\n headers.set('Access-Control-Allow-Origin', origin)\n }\n\n const methods = corsConfig.methods || ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']\n headers.set('Access-Control-Allow-Methods', methods.join(', '))\n\n const allowedHeaders = corsConfig.allowedHeaders || ['Content-Type', 'Authorization', 'X-Requested-With']\n headers.set('Access-Control-Allow-Headers', allowedHeaders.join(', '))\n\n if (corsConfig.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true')\n }\n\n if (corsConfig.maxAge) {\n headers.set('Access-Control-Max-Age', corsConfig.maxAge.toString())\n }\n }\n\n return headers\n }\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\n\n\n\n// ╔════════════════════════════════════════ ════ ════════════════════════════════════════╗\n\n // Export all types\n export * from './types.d';\n\n // Export Logger\n export { Logger };\n\n // Export SecurityManager for advanced use cases\n export { SecurityManager };\n\n // Export Router for advanced use cases\n export { Router };\n\n // Export DB and database helpers\n export {\n DB,\n table,\n column,\n integer,\n text,\n real,\n blob,\n numeric,\n primaryKey,\n notNull,\n unique,\n defaultValue,\n references\n } from './mod/db';\n\n // Export DB types\n export type {\n ColumnType,\n SqlValue,\n ColumnDefinition,\n TableSchema,\n WhereCondition,\n QueryBuilder\n } from './mod/db';\n\n // Default export\n export default server;\n\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}